2015-10-17 47 views
0

我有一個node.js webserver,它應該執行一個在運行時以低延遲傳遞的javascript-String。我基本上是在尋找Java代碼的Node.js的版本:以低延遲在node.js中創建V8實例

import com.eclipsesource.v8.V8; 

public class MainC { 

private static V8 v8; 

private static int result; 

public static void main(String[] args) { 

    long time0 = System.nanoTime(); 
    createRuntime();  
    long time1 = System.nanoTime(); 

    String script = "x(0,10000); " 
     + "function x(y,z) { " 
     + "  if (z>0) {" 
     + "   return x(y+1,z-1); " 
     + "  } else {" 
     + "   return y;" 
     + "  } " 
     + "}" 
     + ""; 

    simulateHTTPRequestAndExucuteScript(script); 
    long time2 = System.nanoTime();   

    System.out.println("Result: " + result);   
    System.out.println("Time for 'createRuntime()' : " + ((time1-time0)/1000000.0) + " ms"); 
    System.out.println("Time for 'executeIntScript()' : " + ((time2-time1)/1000000.0) + " ms"); 
} 

private static void createRuntime() { 
    v8 = V8.createV8Runtime(); 
} 

private static void simulateHTTPRequestAndExucuteScript(String s) { 
    result = v8.executeIntScript(s); 
} 

} 

,輸出:

Result: 10000 
Time for 'createRuntime()' : 741.709313 ms 
Time for simulateHTTPRequestAndExucuteScript()' : 0.888719 ms 

運行時創建和腳本的執行是兩個分開的任務。請注意,10000次遞歸調用的實際執行時間爲< 1ms。初始化運行時間相對較長的時間並不重要,因爲這可以在字符串傳遞之前完成。

如何使用nodes.js完成V8運行時創建和低延遲JavaScript代碼注入?

回答

0

您是否嘗試過nodejs的vm module

var vm = require('vm'); 
var script = "result = x(0,10000); " 
    + "function x(y,z) { " 
    + "  if (z>0) {" 
    + "   return x(y+1,z-1); " 
    + "  } else {" 
    + "   return y;" 
    + "  } " 
    + "}" 
    + ""; 
var context = {result: null}; 

vm.createContext(context); 

vm.runInContext(script, context); 
console.log(context.result); 
+0

大約需要5ms。這是可以接受的。謝謝 – Bug5

0

eh .... node.js是一個v8運行時包裝器。 你不需要創建,注入等與node.js 閱讀關於頁面的基本nodejs:https://nodejs.org/en/about/ 基本上你寫javascript,通過node.js運行它(它再次,是與額外的C++ libs包裝的v8 JS代碼)和多數民衆贊成在它。

在你的情況下,你通過nodejs運行的主要js文件將會執行你擁有的那個js代碼(那個函數(x)....)並且調用它多少次你想要的。

運行js文件只是所有的 「節點我-jsfile.js」

多數民衆贊成。

+0

問題是,這需要幾百毫秒在我的電腦上。因此,我正在尋找初始化V8和執行js文件的分離,就像在java代碼 – Bug5

+1

中完成的操作一樣,我不確定是否瞭解v8和nodejs是什麼,並且在您的java代碼中,您不計算時間它需要初始化你的java jvm所以它是一個虛張聲勢。引發nodejs實例需要時間。一旦啓動,你可以打開一個套接字並請求來自其他任何項目的請求(可以說是java),當向nodejs發出請求時,它可以立即處理,而不是等到v8啓動已經運行,並通過套接字再次返回輸出。 – sagie

+0

我改變了代碼,使我的意思更清晰。 'long time0 = System.nanoTime();'和'long time1 = System.nanoTime();'V8被初始化。這需要741ms。在這個階段將不知道將要執行的實際腳本。在'long time1 = System.nanoTime();'和'long time2 = System.nanoTime();'之間,腳本被創建並執行。這需要0,8ms。我所瞄準的用例是:1)Webserver啓動。 2)Webserver初始化V8實例並等待請求。 3)傳入的httprequest將js-code作爲字符串作爲參數,並在V8中執行 - >響應請求的最短時間。 – Bug5