コンテンツへスキップ

javax.scriptの調べ物1

ScriptEngineManagerとScriptEngineをたくさん作った場合のメモリとCPU負荷を調べました。

javax.scriptのScriptEngineManagerとScriptEngineは

ScriptEngineManager tManager = new ScriptEngineManager();
ScriptEngine tEngine = tManager.getEngineByXXX();

と言う関係です。

ScriptEngineManagerを1つとScriptEngineを大量生成する場合

for (int i = 0; i < tUnitSize; i++) {
tEngines[i] = tManager.getEngineByName(tEngineName);
}

ScriptEngineManagerとScriptEngineを同じ数だけ大量生成する場合

for (int i = 0; i < tUnitSize; i++) {
tManagers[i] = new ScriptEngineManager();
tEngines[i] = tManagers[i].getEngineByName(tEngineName);
}

の2通りを計測。

条件

Java VM : java version "1.6.0" Java(TM) SE Runtime Environment (build 1.6.0-b105) Java HotSpot(TM) Server VM (build 1.6.0-b105, mixed mode)

テストPC : IBM Thinkpad T42p / PentiumM 2.1GHz, 2GBメモリ、 Windows XP SP2

生成数 : 3000個

Script engine1 : com.sun.script.groovy.GroovyScriptEngine + groovy 1.1 BETA

Script engine2 : com.sun.script.javascript.RhinoScriptEngine + Java備え付けのやつ

結果

エンジン種類ScriptEngineManagerScriptEngineメモリ使用量所用時間
groovy1個3000個224MBJIT効いた後 2秒
groovy3000個3000個247MB初回 6秒 / JIT効いた後 4秒
javascript1個3000個181MBJIT効いた後 4秒
javascript3000個3000個203MB初回 13秒 / JIT効いた後 6秒

groovyが若干早く、javascriptが若干軽いかなというところ。 3000個で250MBぐらい見ておけば良さそう。

ScriptEngineManagerをたくさん生成する意味が分からないと突っ込みを受けそうですが、ScriptEngine毎にClassLoaderを変えることができないからやむを得なくです。 ClassLoaderを変更しないのであればScriptEngineだけ生成すればよいでしょう。

そんなにたくさんScriptEngine生成して何するのかは秘密。

© 2003 Kurusugawa Computer Inc.