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