コンパイル時間はともかく、実行時間が replace による簡単な置換の2倍程度まではやくなった。
COUNT = 500;
var t = "aaaa<%=s.foo%>bbbbb<%=s.bar%>ccc";
var e = EJS(t);
var f = EJS(t, {useWith:true});
var m = {foo:"test", bar:"foobar"};
var b = [
function compile () {
EJS(t);
},
function processing () {
e.run(m);
},
function processing_with_with () {
f.run(m);
},
function replace () {
t.replace(/<%=s\.(\w+)%>/, function (_,a) {
return m[a];
});
}
];
for (var i = 0; i < b.length; i++) {
var fun = b[i];
print(fun.name);
var res = 0;
for (var j = 0; j < COUNT; j++) {
var now = (new Date).getTime();
fun();
res += (new Date).getTime() - now;
}
print(res + "ms / " + (res/COUNT) + "ms");
};Spidermonkey
compile
283ms / 0.566ms
processing
25ms / 0.05ms
processing_with_with
37ms / 0.074ms
replace
12ms / 0.024ms
Rhino
compile
5094ms / 10.188ms
processing
500ms / 1ms
processing_with_with
670ms / 1.34ms
replace
279ms / 0.558ms
ejs.js の高速化より Spidermonkey と Rhino の速度差のほうに驚いた
replace の正規表現に g がついてないから、実際は replace はもうすこし遅いですね