簡體   English   中英

node.js動態javascript執行性能

[英]node.js dynamic javascript execution performance

我想在文件的每一行上執行任意用戶提供的一段javascript代碼。 我創建了一個簡單的節點命令行應用程序,作為一個例子 - 只需占用每一行並輸出其長度:

#!/usr/bin/env node
// eachline.js - execute some js per line in a file

var fs = require('fs'),
    readline = require('readline');
    vm = require('vm');

var args = process.argv.slice(2);

if (args.length < 1) {
    console.log("Usage: eachline.js FILENAME")
    process.exit(code=1)
}

var rd = readline.createInterface({
    input: fs.createReadStream(args[0]),
    output: process.stdout,
    terminal: false
});

var context = vm.createContext({});
// this snippet should be user supplied, arbitrary javascript
var script = vm.createScript('output = input.length');

rd.on('line', function(line) {
    context.input = line;
    script.runInContext(context);
    console.log(context.output);
});

性能不是最佳的。 對於包含100萬行的文件,需要幾分鍾:

$ time ./eachline.js 1M.txt > /dev/null

real    4m14.366s
user    4m12.200s
sys     0m4.545s

使用awk這個簡單的操作大約需要五秒鍾。 使用類似的程序 ,執行任意javascript超過十秒。

我之前沒有使用過節點,所以上面的程序是我第一次沒有受過教育的猜測。 我怎樣才能提高性能?

編輯:上面的源代碼: https//gist.github.com/miku/31864156938fcd0c8430


PS。 目標是擁有一個可以快速在文件的每一行上運行任意javascript的程序。

嘗試這個:

var context = vm.createContext({});
// this snippet should be user supplied, arbitrary javascript
var script = vm.createScript('(function (input) { return input.length; })');
var fn = script.runInContext(context);

rd.on('line', function(line) {
    console.log(fn(line));
});

我們的想法是在函數中包裝提供的表達式,評估腳本然后使用該函數。 我認為v8不會優化script代碼,因為它不應該運行多次。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM