テストしたskkservのバージョン
サーバ バージョン 備考 skkserv 3.9.4 skkserv-bsearch 3.9.4 (binary search) (skkserv+バイナリサーチパッチ) dbskkd dbskkd-0.3-REL dbskkd-cdb dbskkd-cdb-0.51-BETA pskkserv-B pskkserv-5.0 of 1996.12.18 (Berkeley DB) pskkserv-G pskkserv-5.0 of 1996.12.18 (GDBM) skkipserv $Id: skkipserv.c,v 1.2 1995/08/03 06:32:40 ikeyan Exp $ rskkserv rskkserv-1.0.2
Cプログラムckskkserv.cで測定。 (このプログラムのskkservアクセスルーチンはskkfepから持ってきたものです)
検索した単語は、私のユーザ辞書にある単語6941個。
最初、試しにdbskkdとskkserv-bsearchの比較をしたときは、 検索結果自体を読みだすところまでの時間を計ると違いがありませんでした (pskkservの結果の値とほぼ同じ)。 これでは比較できないので、検索にかかった時間だけを計るために、 結果コードの'1'や'4'の1文字を読み込むまでにかかる時間を計りました。
localhost上でサーバを動かしてテスト。 各サーバごとに6回ずつ検索を行い、 2回目以降の5回分のデータの平均をとりました (初回はディスクアクセスの影響が大きいため平均の計算には入れていません)。 2回目以降はある程度キャッシュに入るのでディスクアクセスが少なくなり、 検索速度も向上します。
dbskkd-cdbとrskkserv以外は1回分6941個の単語を検索するのに約23分かかりました。
サーバ 検索時間(μs) skkserv 15401.2 skkserv-bsearch 1514.38 dbskkd 5623.24 dbskkd-cdb 614.848 pskkserv-B 199917 pskkserv-G 199921 skkipserv 808.84 rskkserv 7450.58
サーバ 読込時間(μs) skkserv 199997 skkserv-bsearch 199997 dbskkd 200018 dbskkd-cdb 1841.89 pskkserv-B 199996 pskkserv-G 199997 skkipserv 200000 rskkserv 8481.15
この速度はdbskkd-cdbとrskkserv以外はどれもほぼ同じ。 だいたい1秒間で5個の単語を検索できる。 これが実際のSKKの使用において検索にかかる時間になります。
dbskkdは、全体の約2/3は800μs以下で検索できていますが、 残り1/3が10000μs以上かかっています。 時間がかかっているのはディスクアクセスが入るからのようです。 おそらく、dbskkdで使うファイルは大きすぎて キャッシュに入りきらなかったのだと思います。
サーバ 辞書 サイズ(byte) 備考 skkserv SKK-JISYO.L 2808757 skkserv-bsearch SKK-JISYO.L 2808757 (skkservの使用するものと同じ) dbskkd SKK-JISYO.L.db 11894784 dbskkd-cdb SKK-JISYO.L.cdb 5423153 pskkserv-B SKK-JISYO.L.db 5259264 pskkserv-G SKK-JISYO.L.gdbm 11477386 skkipserv SKK-JISYO.L 2808757 (skkservの使用するものと同じ) rskkserv SKK-JISYO.L+.[an] 3284861 (.a: 24976, .n: 451128)
rskkservは(起動を高速にするため) キャッシュファイルSKK-JISYO.L.aとSKK-JISYO.L.nを作ります。
サーバ VSZ RSS skkserv 156 568 skkserv-bsearch 156 580 dbskkd 176 548 dbskkd-cdb 152 580 pskkserv-B 1424 1472 pskkserv-G 1436 1460 skkipserv 4368 4756 rskkserv 2420 2580
pskkserv-B, pskkserv-Gでは"-"が検索できません。NOT FOUNDになります。 (バグ? DBファイル作成ミス?)
skkserv以外は、NOT FOUNDのとき返す読みの最後に' 'を付けません。
pskkservが遅いのは、flush関係? (でも$|=1;してるし) syswriteを使えば速くなる? そもそもdkbkkd-cdbとrskkservを除けば、 結果文字列を読み出し終わるのにどのサーバも同じ時間かかるのはなぜ? (もっと遅いマシンでテストすれば違いが出てくるのかも)
skkipservは、NOT FOUNDのときに、'\0'のあとに'\n'を入れて返してきます。 これをうまく処理できないクライアントがあるかもしれないので、 '\0'が入らないようにskkipservを skkipserv.c.difのように変更してみました。
skkipservはおくりがなのあるなし判定が不完全なため、 ">"で終わる単語をうまく検索できません。 具体的には、"はん>"、"しん>"など。 dic.c.difのように変更してみました。
ただし、以下のものも完全ではありません。 例えば"#"などで始まっている単語("#ころび#おk"とか)を おくりがななしと判断してしまいます。 (そのようなエントリはSKK-JISYO.Lにはないので、まあいいか)
rskkservもおくりがなのあるなし判定が不完全なため、 ">"で終わっていたり、"#"を含んでいるため 長さが偶数でなくなっている単語の検索がNOT FOUNDになります。 具体的には、"ぜん>"、"だい#かい"など。 skk.rb.difのように変更してみました。 ただし、私はrubyは知らないので、みようみまねで変更しています。 もっといい方法があるかもしれません。
比較表
サーバ 辞書(B) 検索(μs) 読込(μs) VSZ(KB) RSS(KB) 備考 dbskkd-cdb 5423153 614.848 1841.89 152 580 inetdから実行 skkipserv 2808757 800.344 199995 4368 4756 skkserv-bsearch 2808757 1514.38 199997 156 580 dbskkd 11894784 5623.24 200018 176 548 inetdから実行 rskkserv 3284861 7543.78 8562.87 2420 2580 要ruby skkserv 2808757 15401.2 199997 156 568 pskkserv-B 5259264 199917 199996 1424 1472 要perl pskkserv-G 11477386 199921 199997 1436 1460 要perl,GDBM