感覚的な物だけでは何なので I/O -> memcacheの効果を検証してみる為にした。
init()の中で 85bytes のリソースを5つ読み込むだけのServletで試した。
テスト用に用意した環境が撃重で凄い結果になった。

- memcache無し

実行時間 CPU時間
17238ms  1778cpu_ms 
24499ms  1832cpu_ms 
17569ms  1870cpu_ms 
11694ms  1777cpu_ms 

- memcache有り

 6167ms  2015cpu_ms 
 9290ms  1905cpu_ms 
 6573ms  1833cpu_ms 
 1918ms  1376cpu_ms 

CPU時間は変わらないのに実行時間は memcache有りの場合、半分以下になっている。

たまたま凄く重い環境に当たったのだと思うが実機での検証結果なので 何もしないServletが24秒とか実際に起こり得るらしい。
むしろ貴重な情報が取れてラッキーだったかもしれない。

spinup実時間のバラツキに対しては かなり効果が見込めそうなので試してみて欲しい。
できれば結果をコメントしてもらえると情報が蓄積できるのでお願いしまふ。


テストに使ったServlet:

package org.kotemaru.test; import java.io.*; import java.net.*; import javax.servlet.*; import javax.servlet.http.*; import com.google.appengine.api.memcache.*; public class TestServlet extends HttpServlet { private static final String NS_MEMCACHE = "Test"; private static MemcacheService memcache = MemcacheServiceFactory.getMemcacheService(NS_MEMCACHE); public void init(ServletConfig config) throws ServletException { try { System.out.println("start init."); /* getResource(TestServlet.class, "test1.properties"); getResource(TestServlet.class, "test2.properties"); getResource(TestServlet.class, "test3.properties"); getResource(TestServlet.class, "test4.properties"); getResource(TestServlet.class, "test5.properties"); */ getResourceWithCache(TestServlet.class, "test1.properties"); getResourceWithCache(TestServlet.class, "test2.properties"); getResourceWithCache(TestServlet.class, "test3.properties"); getResourceWithCache(TestServlet.class, "test4.properties"); getResourceWithCache(TestServlet.class, "test5.properties"); } catch (Exception e) { e.printStackTrace(); throw new ServletException(e); } } public void service(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException { response.getWriter().write("test"); return; } public static String getResourceWithCache(Class clazz, String name) throws IOException { String val = (String) memcache.get(name); if (val != null) { val = getResource(clazz, name); memcache.put(name, val); } return val; } public static String getResource(Class clazz, String name) throws IOException { InputStream in = clazz.getResourceAsStream(name); try { return readerToString(new InputStreamReader(in, "UTF-8")); } finally { in.close(); } } public static String readerToString(Reader reader) throws IOException { StringBuffer sbuf = new StringBuffer(); int n = 0; char[] buff = new char[4096]; while ((n=reader.read(buff)) > 0) { sbuf.append(buff, 0, n); } return sbuf.toString(); } }

関連記事: