各種skkservの比較

skkservとdbskkdなどで検索にかかる時間を比較してみました。 (調査は1998年12月ごろに行いました。各プログラムのバージョンは当時のものです)

目次

  1. テスト環境・条件
  2. 結果
    1. 1単語あたりの平均検索時間
    2. (参考)1単語あたりの結果読み込み完了までの平均時間
    3. ディスク使用量
    4. メモリ使用量
  3. 気づいたこと
  4. まとめ
  5. 各サーバの入手
  6. その他のサーバ
  7. UNIX以外で動かすskkserv
  8. 関連情報
  9. 変更履歴

テスト環境・条件

テストした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分かかりました。

結果

結果のグラフ

1単語あたりの平均検索時間

  サーバ        検索時間(μ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

(参考)1単語あたりの結果読み込み完了までの平均時間

結果コード'1'や'4'だけでなく、 実際の検索結果を全て読み込むまでにかかる時間。 ただし、以下の値は、openSKKserv()からcloseSKKserv()までに かかった時間を単語数で割ったもの。 つまり、正確には単語あたりの結果読み込み完了までの時間ではありませんが、 およそこれくらいの値。
  サーバ       読込時間(μ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を作ります。

メモリ使用量(KB)

psで一度くらい見てみるという方法でチェックしてみました(かなりいいかげんです)。 入力として与えた最後の単語を検索したあとの時点でのpsの出力を見てみました。
  サーバ         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

各サーバの特徴

dbskkd-cdb (dbskkd-cdb-0.52-BETA)
skkipserv ($Id: skkipserv.c,v 1.2 1995/08/03 06:32:40 ikeyan Exp $ (skkip-0.11))
skkserv-bsearch (skkserv + バイナリサーチパッチ)
dbskkd (dbskkd-0.3-REL)
rskkserv (rskkserv-1.0.2)
skkserv (3.9.4 (SKK-9.6))
pskkserv-B (pskkserv-5.0 of 1996.12.18 (Berkeley DB) (SKK-9.6))
pskkserv-G (pskkserv-5.0 of 1996.12.18 (GDBM) (SKK-9.6))

各サーバの入手

その他のサーバ

skksearch
multiskkserv
gtskkserv
fskkserv
skk4j
skkservのJavaでの実装が含まれる。
JSKKServer
Javaで記述したSKK server。Javaが動く環境なら動作可能(なはず)。

UNIX以外で動かすskkserv

Ruby, Perl, Javaなどで動かすものであれば、 これらの環境が対応していればUNIX以外のOSでも動かせると思います。

Windows用skkserv

WindowsCE用skkserv

関連情報


変更履歴

2003/3/15 (土)
fskkserv, skk4j へのリンクを追加。 OS/2 上で動くSKK サーバーのバイナリ(http://www.t3.rim.or.jp/~zodiac/jinput/) へのリンクを削除(無くなったみたいなので)。
2002/5/17 (金)
UNIX以外で動かすskkservの項を追加
2002/2/25 (月)
gtskkserv へのリンクを追加。いくつかのリンクを更新。
2001/6/8 (金)
multiskkserv へのリンクを追加。

<deton(木原 英人 / KIHARA, Hideto)@m1.interq.or.jp>
初版作成: 1999/01/09
最終更新: $Date: 2003/07/24 13:00:55 $