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

snuffkinの遊び場

IT関係、スポーツ、数学等に関することを、気が向いたときに書いてます。

Java APIでの性能

memcachedのJava API(memcached client for java)を利用して性能測定をしてみました。以下は、1KBの文字列を10000回setしたとき、getしたときに必要とした時間です。Pythonと比較して並べてみました。

API set time get time
python-memcached 1797msec(=5565event/sec) 2984msec(=3351event/sec)
memcached client for java 2860msec(=3497event/sec) 5368msec(=1863event/sec)

あらら、PythonJavaに勝ったよ。


memcached client for javaでの計測環境は以下の通り。(python-memcachedでの計測と一緒です)

  • クライアントもサーバも同一マシン。
  • OS:Windows Vista
  • CPU:Intel Core2 Duo T7500 2.20GHz
  • Memory:2GB
  • memcached:Windows版 version1.2.6
  • Javaのバージョン:1.6.0_05
  • memcached client for javaのバージョン:2.0.1

memcachedの起動オプションは以下の通り。

memcached.exe -p 11211 -m 64m

set計測は以下のプログラムを10回実行した平均値を取りました。

package memcachedsample;

import com.danga.MemCached.MemCachedClient;
import com.danga.MemCached.SockIOPool;

public class SetMessage {
	public static void main(String[] args){
		// initialize
		String[] servers = {"127.0.0.1:11211"};
		SockIOPool pool = SockIOPool.getInstance();
		pool.setServers( servers );
		pool.initialize();

		MemCachedClient mc = new MemCachedClient();
		mc.flushAll();

	    int messageNum  = 10000;
	    int messageSize = 1;
	    String message = getMessage(messageSize);
	    
	    // set
	    long startTime = System.currentTimeMillis();
	    for (int index = 0; index < messageNum; index++) {
	    	mc.set(Integer.toString(index), message);
	    }
	    long endTime = System.currentTimeMillis();
	    
	    // print progress time
	    long progressTime = endTime - startTime;
	    System.out.println("messages: " + messageNum);
	    System.out.println("set time: " + progressTime);
	}
	
	public static String getMessage(int kbytes) {
		StringBuffer buffer = new StringBuffer();
		for (int index = 0; index < 100 * kbytes; index++) {
			buffer.append("1234567890");
		}
		return buffer.toString();
	}
}

get計測は以下のプログラムを10回実行した平均値を取りました。

package memcachedsample;

import com.danga.MemCached.MemCachedClient;
import com.danga.MemCached.SockIOPool;

public class GetMessage {
	public static void main(String[] args){
		// initialize
		String[] servers = {"127.0.0.1:11211"};
		SockIOPool pool = SockIOPool.getInstance();
		pool.setServers( servers );
		pool.initialize();

		MemCachedClient mc = new MemCachedClient();
	    int messageNum  = 10000;
	    
	    // get
	    long startTime = System.currentTimeMillis();
	    for (int index = 0; index < messageNum; index++) {
	    	String message = (String) mc.get(Integer.toString(index));
	    }
	    long endTime = System.currentTimeMillis();
	    
	    // print progress time
	    long progressTime = endTime - startTime;
	    System.out.println("messages: " + messageNum);
	    System.out.println("set time: " + progressTime);
	}
}

上記プログラムからも分かるように、正確には1KBより少し小さいメッセージを送っています。
memcached client for javaは全くチューニングしないで利用していますし、もっと速そうなJava版Clientがありそうなので不利かもしれませんが、負けてしまいましたね。こりゃいかんですね。