node.js动态javascript执行性能
我希望在文件的每一行上执行一段由用户提供的任意javascript代码。我创建了一个简单的node命令行应用程序,作为一个示例,它将只获取每一行并输出其长度:node.js动态javascript执行性能,javascript,node.js,performance,file,awk,Javascript,Node.js,Performance,File,Awk,我希望在文件的每一行上执行一段由用户提供的任意javascript代码。我创建了一个简单的node命令行应用程序,作为一个示例,它将只获取每一行并输出其长度: #!/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 = p
#!/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);
});
使用awk
这个简单的操作大约需要5秒钟。使用,它执行任意javascript的时间略多于10秒
我以前没有使用过node,所以上面的程序是我第一次对解决方案进行未经教育的猜测。如何提高绩效
编辑:上面的源代码摘要:
另外,我们的目标是拥有一个可以在文件的每一行上快速运行任意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不会优化
脚本中的代码,因为它不应该运行多次。您能解释一下您想要实现的目标吗?从发布的问题来看,这真的不清楚。为什么要在单独的上下文中为每一行运行代码?用户应该能够定义要在每一行上动态执行的js代码段vm.runInNewContext
是我找到的方法,它允许将一些上下文传递给执行(这里是输入行
),我可以从中得到结果(这里是输出
)。您是否尝试创建一次上下文并对每一行重新使用它?哦,等等-是的,@mscdex所说的-您可以使用vm.createContext()
创建上下文,vm.createScript()
预解析脚本,然后使用vm.runInContext()
反复使用相同的上下文。这将是一个很好的尝试,它需要对代码进行相当小的更改。在我看来,vm.runInContext()
是一个阻塞操作。也许您可以使用异步模块异步运行它?谢谢,但这似乎抛出了一个ReferenceError
:您需要将代码包装到函数中并将输入作为参数传递:'(函数(输入){return input.length;})
对不起,我第一次读过了闭包。这确实提供了一个巨大的加速,从超过4分钟到23秒。
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));
});