3

CanJS アプリケーションのページを事前生成するシステムに取り組んでいます。そうすれば、ページはすぐに利用できるようになり、#! ヘッドレスブラウザ。

問題は、rhinoのパフォーマンスが、最新のブラウザー内で使用される V8 やその他のネイティブ Javascript エンジンよりも劇的に遅いように見えることです。ブラウザ内では、ページが EJS テンプレートを生成するのに最悪でも 3 ~ 4 秒かかり、rhino10 ~ 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 の実装に 2 倍以上の時間がかかることはないと思います。

私は現在ここで立ち往生しており、先に進む方法がわかりません。そんなに時間がかかるものをどのようにプロファイリングするのですか? 原因は何ですか?

4

0 に答える 0