読者です 読者をやめる 読者になる 読者になる

Igo : MeCabと形態素解析速度比較

Java speed

Igo(0.4.0)MeCab(0.97)形態素解析速度を再度比較してみた。

計時用のプログラム

MeCabの計時用のプログラム。
参照: ReadLine

/**
 * ファイル名: mec.cc
 * コンパイル: g++ -O3 -omec mec.cc `mecab-config --libs`
 * 計時方法: time mec <対象ファイル>
 *
 * gcc: 4.2.4 (Ubuntu 4.2.4-1ubuntu4)
 */
#include <mecab.h>
#include "read_line.h"
#include <cstdio>

int main(int argc, char** argv) {
  mecab_t* m = mecab_new2("-Owakati");
  ReadLine rl(argv[1]);
  const char* line;

  while(line=rl.read()) {
    // 行読み込み自体のコストを計る時は、以下の一行をコメントアウトする
    mecab_sparse_tostr(m,line);
  }

  mecab_destroy(m);
  return 10;
}

Igo用の計時プログラム。
もともとあるソースを少し修正して流用。

/**
 * 計時方法: time java -server -cp igo-0.4.0.jar net.reduls.igo.bin.Igo <バイナリ辞書ディレクトリ> < <対象ファイル> 
 *
 * java: jdk-6u18-linux-i586.bin
 */
package net.reduls.igo.bin;

import java.io.IOException;
import net.reduls.igo.Tagger;
import net.reduls.igo.Morpheme;
import net.reduls.igo.util.ReadLine;

public final class Igo {
    public static void main(String[] args) throws IOException {
        final String  dicDir   = args[0];  // バイナリ辞書配置ディレクトリ
        final Tagger  tagger   = new Tagger(dicDir);        
        final ReadLine rl = new ReadLine(System.in);

        for(String s=rl.read(); s != null; s=rl.read()) {
            // 行読み込み自体のコストを計る時は、以下の一行をコメントアウトする
            tagger.wakati(s);
        }
    }   
}

計時結果

テキストには青空文庫より取得の夏目漱石の『こころ』(x256. 136M. UTF-8)を、辞書にはMeCabのサイトより入手可能なmecab-ipadic-2.7.0-20070801を使用。

総処理時間(1)行読み込み時間(2)1 - 2
MeCab28.311s0.216s28.095s
Igo33.901s0.996s32.905s
(例によってあまり厳密な比較ではないので参考程度にしかならないが)いつのまにかMeCabとほぼ変わらない処理速度となっていた。
少しびっくり。
common lisp(sbcl)でも試したくなってきた。