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備え付けのやつ

結果

エンジン種類 ScriptEngineManager ScriptEngine メモリ使用量 所用時間
groovy 1個 3000個 224MB JIT効いた後 2秒
groovy 3000個 3000個 247MB 初回 6秒 / JIT効いた後 4秒
javascript 1個 3000個 181MB JIT効いた後 4秒
javascript 3000個 3000個 203MB 初回 13秒 / JIT効いた後 6秒

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

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

そんなに沢山ScriptEngine生成して何するのかは秘密。

カテゴリー: 技術情報

3件のコメント

ojarz · 2007-06-23 10:23

こういうテストが出来るのはいいですね。
私には、条件設定などのベース知識が無いので、出来ません。

squld · 2007-06-24 02:40

条件設定はテキトーという罠w

来栖川ブログ · 2007-06-24 16:55

javax.scriptの調べ物2…

(more…)

現在コメントは受け付けていません。