node.js动态javascript执行性能

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

我希望在文件的每一行上执行一段由用户提供的任意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 = 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));
});