検索 K
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生成して何するのかは秘密。
