Skip to content

Commit 6fe8409

Browse files
committed
多个脚本引擎执行JavaScript(未预编译)的性能比较
1 parent 11d1c36 commit 6fe8409

2 files changed

Lines changed: 111 additions & 0 deletions

File tree

lib/commons-jexl3-3.0.jar

375 KB
Binary file not shown.
Lines changed: 111 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,111 @@
1+
package cn.aofeng.demo.script;
2+
3+
import java.util.HashMap;
4+
import java.util.Map;
5+
6+
import javax.script.Bindings;
7+
import javax.script.ScriptEngine;
8+
import javax.script.ScriptEngineManager;
9+
import javax.script.ScriptException;
10+
11+
/**
12+
* 多个脚本引擎执行JavaScript的性能比较。
13+
*
14+
* @author <a href="mailto:[email protected]">聂勇</a>
15+
*/
16+
public class MultiScriptEngineCompare {
17+
18+
/**
19+
* 获取指定的脚本引擎执行指定的脚本。
20+
*
21+
* @param scriptEngineName 脚本引擎名称
22+
* @param script 脚本
23+
* @param count 脚本的执行次数
24+
* @param vars 绑定到脚本的变量集合
25+
* @throws ScriptException 执行脚本出错
26+
*/
27+
public void execute(String scriptEngineName, String script, int count,
28+
Map<String, Object> vars) throws ScriptException {
29+
ScriptEngine scriptEngine = getScriptEngine(scriptEngineName);
30+
System.out.println( String.format("脚本引擎:%s", scriptEngine.getFactory().getEngineName()) );
31+
System.out.println( String.format("脚本:%s", script) );
32+
System.out.println( String.format("脚本绑定参数:%s", vars) );
33+
long startTime = System.currentTimeMillis();
34+
for (int i = 0; i < count; i++) {
35+
runSingleScript(script, vars, scriptEngine);
36+
}
37+
long usedTime = System.currentTimeMillis() - startTime;
38+
System.out.println( String.format("脚本执行%d次,消耗%d毫秒。", count, usedTime) );
39+
System.out.println("");
40+
}
41+
42+
private void runSingleScript(String script, Map<String, Object> vars, ScriptEngine scriptEngine) throws ScriptException {
43+
if (null == vars || vars.isEmpty()) {
44+
scriptEngine.eval(script);
45+
} else {
46+
Bindings binds = createBinding(scriptEngine, vars);
47+
scriptEngine.eval(script, binds);
48+
}
49+
}
50+
51+
/**
52+
* 根据名称获取脚本引擎。
53+
*
54+
* @param name 脚本引擎名称
55+
* @return 实现了{@link ScriptEngine}的脚本引擎。如果没有对应的脚本引擎,返回null。
56+
*/
57+
public ScriptEngine getScriptEngine(String name) {
58+
ScriptEngineManager sem = new ScriptEngineManager();
59+
return sem.getEngineByName(name);
60+
}
61+
62+
private Bindings createBinding(ScriptEngine scriptEngine, Map<String, Object> vars) {
63+
Bindings binds = scriptEngine.createBindings();
64+
if (null != vars && !vars.isEmpty()) {
65+
binds.putAll(vars);
66+
}
67+
68+
return binds;
69+
}
70+
71+
/**
72+
* @param args 执行次数
73+
* @throws ScriptException
74+
*/
75+
@SuppressWarnings({ "rawtypes", "unchecked" })
76+
public static void main(String[] args) throws ScriptException {
77+
if ( args.length != 1) {
78+
System.err.println("参数错误。使用示例:\n java cn.aofeng.demo.script.MultiScriptEngineCompare 100000");
79+
System.exit(-1);
80+
}
81+
int count = Integer.parseInt(args[0]);
82+
83+
String[] scriptEngineList = {"JavaScript", "JEXL"};
84+
85+
String script1 = "var c = a + b;" +
86+
"var d = a * b;" +
87+
"var e = a / b;" +
88+
"var f = a % b;" +
89+
"var g = a - b;" +
90+
"var result = ((a * 5) > b || b * 10 >= 100) && (a * b > 99);";
91+
Map<String, Object> vars1 = new HashMap<String, Object>(2);
92+
vars1.put("a", 20);
93+
vars1.put("b", 9);
94+
95+
String script2 = "var result = src.indexOf(b);";
96+
Map<String, Object> vars2 = new HashMap<String, Object>(2);
97+
vars2.put("src", "compare performance javascript and jexl");
98+
vars2.put("b", "script");
99+
100+
String[] scriptList = {script1, script2};
101+
Map[] varsList = {vars1, vars2};
102+
103+
MultiScriptEngineCompare msec = new MultiScriptEngineCompare();
104+
for (int i = 0; i < scriptEngineList.length; i++) {
105+
for (int j = 0; j < scriptList.length; j++) {
106+
msec.execute(scriptEngineList[i], scriptList[j], count, varsList[j]);
107+
}
108+
}
109+
}
110+
111+
}

0 commit comments

Comments
 (0)