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) |
memcached client for javaでの計測環境は以下の通り。(python-memcachedでの計測と一緒です)
- クライアントもサーバも同一マシン。
- OS:Windows Vista
- CPU:Intel Core2 Duo T7500 2.20GHz
- Memory:2GB
- memcached:Windows版 version1.2.6
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がありそうなので不利かもしれませんが、負けてしまいましたね。こりゃいかんですね。