3

我正在开发一个预生成 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 实现不会花费超过两倍的时间。

我目前被困在这里,不知道如何进行。如何描述需要这么多时间的事情?可能是什么原因?

4

0 回答 0