Hatena::ブログ(Diary)

駄文生産所 このページをアンテナに追加 RSSフィード

2011-05-29

形態素解析エンジン Goist for Squeak

形態素解析エンジンGoistをSqueakでも使えるようにした。

バイナリ辞書VisualWorks版と互換

使い方はVisualWorks版と同じなのでそちらを参照のこと。

Goist速度計測

形態素解析エンジンGoistの速度を計測した。

以前行ったIgoの結果を含めて簡単に比較する。


環境



測定内容


結果

実行時間
Java(Igo)VW(Igo)VW(Goist)CogVM(Goist)SqueakVM(Goist)
834222926393582 (2回目)
4272 (初回)
27362

単位ミリ


実行時間
Java(Igo)VW(Igo)VW(Goist)CogVM(Goist)SqueakVM(Goist)
12.673.164.29 (2回目)
5.12 (初回)
32.8
0.320.8411.36 (2回目)
1.62 (初回)
10.37
0.230.620.741 (2回目)
1.19 (初回)
7.64

同じロジックで解を出しているのだが、VW(Igo)に比べてVW(Goist)は少々遅い。これは、わかりやすさ優先で冗長に書いた分、辞書構造が変わっていたり、メソッド呼び出しが増えるなどしているので想定通り。まずまず。

CogVMの性能がVisualWorksVMの性能に迫っていて驚かされた。まぁ同じ人が作っているわけだが。SqueakUIフレームワークであるMorphicが絡むと、そこにCPUパワーが取られてしまいがちだが、Webアプリプラットフォームとしてなら、かなりやれそう。ただ、IO周りが遅いので、そちらに引っ張られるかもしれない。

素のSqueakVMにはそろそろ引退かな。

辞書の読み込み時間については、最初に一度読み込んだ後はそれを使いまわすことを想定しているため、重視していない。概ね、Java(Igo)は一瞬、VW(Igo)は7秒、VW(Goist)は15秒、CogVM(Goist)は30秒、SqueakVM(Goist)は75秒程度で、Javaの速さが際立つ。というよりはSmalltalk陣営が遅い。Ruby(Igo)も3秒程度であった。

(追記)

実装が悪かった。VW(Goist)は4秒、CogVM(Goist)は10秒程度まで縮められた。それでもまだJavaRubyが速いが、際立って遅いというわけではないと思われる。


おまけ

CogVMの場合の、各回の結果を載せる。

JITが効いている様子が窺える。

"Squeak-CogVM(Goist) 初回"
6422 milliseconds
4355 milliseconds
4094 milliseconds
3947 milliseconds
4045 milliseconds
4114 milliseconds
4176 milliseconds
4226 milliseconds
3459 milliseconds
3883 milliseconds
Average: 4272 milliseconds
"Squeak-CogVM(Goist) 2回目"
3358 milliseconds
3391 milliseconds
3931 milliseconds
3395 milliseconds
3832 milliseconds
3373 milliseconds
3869 milliseconds
3381 milliseconds
3916 milliseconds
3375 milliseconds
Average: 3582 milliseconds

使用コード

VisualWorks Smalltalk
dictionaryDirectoryPath := 'C:\ipadic-test'.
dictionary := GDictionary from: dictionaryDirectoryPath.
tagger := dictionary newTagger.
contents := ('c:\temp\igo\kokoro.txt' asFilename withEncoding: #'utf-8') readStream contents.
sum := 0.
10 timesRepeat: [
    | timeToRun |
    timeToRun := Time millisecondsToRun: [tagger parse: contents].
    
    sum := sum + timeToRun.
    Transcript cr; show: timeToRun printString , ' milliseconds'.
].
Transcript cr; show: 'Average: ' , (sum // 10) printString , ' milliseconds'. 
Squeak Smalltalk
dictionaryDirectoryPath := 'C:\ipadic-squeak-test'.
dictionary := GDictionary from: dictionaryDirectoryPath.
tagger := dictionary newTagger.
fs := FileStream readOnlyFileNamed: 'c:\temp\igo\kokoro.txt'.
contents := fs contents.
fs close.
sum := 0.
10 timesRepeat: [
    | timeToRun |
    timeToRun := Time millisecondsToRun: [tagger parse: contents].
    
    sum := sum + timeToRun.
    Transcript cr; show: timeToRun printString , ' milliseconds'.
].
Transcript cr; show: 'Average: ' , (sum // 10) printString , ' milliseconds'. 
Connection: close