GAE の spinup の高速化の為に memcache を使う方法を試してみた。
結論から言うと失敗。

具体的には一番時間のかかっている Config クラスの初期化を
初期化済みインスタンスを memcache に保存する事で2回目から
スキップすると言う方法。


具体的なコードはこんな感じ

public static void init(WsjsServlet servlet, ServletConfig servletConfig, File file) throws Exception {
Object obj = loadConfig();
if (obj != null) {
System.out.println("Config hot boot. "+obj);
INSTANCE = (Config) obj;
return;
}

INSTANCE = new Config();
:
// 初期化処理。
:

saveConfig(INSTANCE);
}

private static void saveConfig(Config config) throws CacheException {
MemcacheService memcache = MemcacheServiceFactory.getMemcacheService("Config");
memcache.put("config", config);
}

private static Config loadConfig() throws CacheException {
MemcacheService memcache = MemcacheServiceFactory.getMemcacheService("Config");
return (Config) memcache.get("config");
}



実行結果:

// 1回目キャッシュ無し
08-15 12:07AM 10.183 /index.html 200 4964ms 5800cpu_ms 65api_cpu_ms

// 2回目以降キャッシュ有り
08-15 12:16AM 01.436 /index.html 200 4415ms 4790cpu_ms 65api_cpu_ms
08-15 12:22AM 42.546 /index.html 200 5314ms 5353cpu_ms 65api_cpu_ms
08-15 12:25AM 20.302 /index.html 200 7016ms 5100cpu_ms 65api_cpu_ms
08-15 12:35AM 00.672 /index.html 200 4944ms 5470cpu_ms 65api_cpu_ms



CPU時間こそ若干減っている物の実時間では誤差に埋もれるレベル。

memcache も put/get で シリアラズ/アンシリアライズ しているようなので、
やはりクラスのロードがボトルネックなのかもしれない。

正直、初見で5秒で画面が現れないとお客さん逃げちゃうのでBtoCでの利用が難しんだよね。
なんとかならんもんかね。

P.S.
これデシリアライズに失敗していたので参考にならない。