我正在开发一个预生成 CanJS 应用程序页面的系统。这样我们的页面立即可用,我们不需要用#来处理 SEO 的东西!和无头浏览器。
问题是rhino的性能似乎比现代浏览器中使用的 V8 或其他原生 Javascript 引擎慢得多。在浏览器中,页面生成 EJS 模板最多需要 3-4 秒,rhino需要 10-12分钟。页面和生成器都使用从 RESTful API 收集的相同 JSON。
我使用最高优化级别创建了一个 Javascript 上下文:
context = ContextFactory.getGlobal().
context.setOptimizationLevel(9);
scope = context.initStandardObjects();
scriptable = context.newObject(scope);
使用当前EJS 库调用 EJS 渲染过程
function invokeEjs(ejsContent, parameters){
try{
var unwrap = eval('new Object(' + parameters + ')');
return new EJS({
text: ejsContent
}).render(unwrap);
} catch(e){
return outputException(e, ejsContent);
}
}
现在,一旦我调用此方法,它需要很长时间。
HashMap<String, Object> parameters = new HashMap<String, Object>();
// ...
// ... loading some content into parameters hashmap
// ...
String ejsTemplate = "... a pre loaded ejs template from file ..."
String serializedParameters = jsonParser.toJson(parameters);
Function fct = (Function) scope.get("invokeEjs", scope);
Object resultTemp = fct.call(context, scriptable, scriptable, new Object[] { ejsTemplate, serializedParameters });
serializedParameters可以变得非常大,但这不会打扰浏览器,我希望 Rhino 实现不会花费超过两倍的时间。
我目前被困在这里,不知道如何进行。如何描述需要这么多时间的事情?可能是什么原因?