Open usp Tukubaiコマンド共通フレームワークを目指して作りました。コンマを付ける必要最小限の処理はcomma.impl.cで行い、その他、Open usp Tukubaiコマンドで共通の機能は、apply/fldmrg/bashスクリプトで行います。
C言語(Not C++)で作ったのは、軽さ(モジュールの小ささ)を狙ったためです。(C++が必要なのはvectorだけなので、という理由もあります)apply/fldmrgの類のコマンドは、誰か作っていそうな気がするのですが、私自身、見たことがないので作ってみました。ユニケージ開発で幅広く使えるコマンドだと思います。
テスト方法:1000万レコードのデータを入力し、commaをテストしました。同一環境で3コマンドを比較しております。
$ seq 1 10000000 | tarr > data $ ls -al data | comma 5 -rwxrwx--- 1 root vboxsf 78,888,897 12月 19 09:29 2014 data $ time comma 1 data > result (製品版のcomma) $ time ./comma 1 data > result (Open usp Tukubaiのcomma) $ time /usr/local/bin/comma 1 data > result (応募作品)
テスト結果:Open usp Tukubaiより実行速度が速いですね!
製品版 | 応募作品 | Open usp Tukubai | |
---|---|---|---|
real | 0m0.803s | 0m34.523s | 6m46.338s |
user | 0m0.421s | 0m20.943s | 6m45.293s |
sys | 0m0.166s | 0m23.032s | 0m0.479s |
TIPS: データの読み込みにread(1)システムコールを1バイトサイズごとに呼び出しておられますが、コンテキストスイッチ的にもディスクI/O的にもこれはとても負荷の高い処理です。読み込みをfopen(3)系の関数に変更するか、fopen(3)系の関数が実施しているのと似たようなバッファ処理を記述することでさらに高速化が可能だと思います。
ソースの短さという観点からは少し弱いですね。とはいえ、今回は共通フレームワークを目指したということですので、ソースコードが長くなるのはしょうがないかと思います。
$ gyo -f *.c | keta -- | awk '{print $0"行"}' apply.c 303行 comma.impl.c 142行 fldmrg.c 125行 vector_int32.c 65 行 vector_int64.c 65 行 vector_int8.c 103行 $ gyo -f *.c | sm2 0 0 2 2 | awk '{print $0"行"}' 803行 $
各コマンドの共通フレームワークを作るという試みの面白さと美しさは理解できます。applyとfldmrgを使えば各フィールドに別々のコマンドを適用することが出来るため、あとはその最小コマンドを作れば処理手法を増やせるという手法ですね。1技術者として非常に面白い試みだと感じます。
しかし、弊社のユニケージ開発手法とは相容れない手法です。ユニケージ開発手法の場合、各コマンドが共有するライブラリは存在せず、コマンドに必要なソースコードは全て1ファイルに入れています。各コマンドで共通の処理が存在する場合は、そのソースコードをコピーして使っています。弊社ではそのやり方を「全有」という概念で説明しています。詳しくは弊社の教育講座K-ARCHにて詳しく説明しておりますが、様々な過去の経緯からその手法を採用しています。
以上から応募作品はユニケージ開発手法とは相容れない手法ですので、美しさ・面白さの観点から評価は出来ません。ただし1技術者としてとても面白い試みだと思います。
実用としてエラーなく使えることを目指しましたが、さてどうでしょうか。
テスト方法:1000万レコードのデータを入力し、commaをテストしました。VM環境でテストしたので全体的な実行速度は遅めですが、同一環境で3コマンドを比較しております。
$ seq 1 10000000 | tarr > data $ ls -al data | comma 5 -rwxrwx--- 1 root vboxsf 78,888,897 12月 19 09:29 2014 data $ time comma 1 data > result (製品版のcomma) $ time ./comma 1 data > result (Open usp Tukubaiのcomma) $ time gawk -f ../comma.awk 1 data > result (応募作品)
テスト結果:Open usp Tukubaiより実行速度が速いですね!
製品版 | 応募作品 | Open usp Tukubai | |
---|---|---|---|
real | 0m0.803s | 1m4.413s | 6m46.338s |
user | 0m0.421s | 1m4.132s | 6m45.293s |
sys | 0m0.166s | 0m0.235s | 0m0.479s |
TIPS: awkの実装系としてはmawkが高速です。awkでさらなる高みに上り詰めるならmawkの使用も検討してみてください。
Open usp Tukubaiのcomma:228行 応募作品のcomma:98行
短いですね!
ソースコード内にて繰り返しを多用していて awk の書き方としてはあまり美しくないかも…
特にありませんでした。
usp Tukubaiのコマンドのうち特によく使われるものについては「Open usp Tukubai」というオープンソース版を公開しています。本サイト(UEC : ユニケージ・エンジニア・コミュニティ)ではこれらコマンドの使い方をさまざまな方向から紹介しています。
コンテストではこうしたすでにオープンソースソフトウェアとして提供されているコマンドや、オープンソース版の実装は公開していないものの、マニュアル(つまり仕様書)は公開してあるコマンドなどについて開発競争を行います。
実装を募したコマンドは次のとおりです。
次の4つのポイントを中心に審査員がソースコードを評価しています。