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…)