[英]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.