node.jsdynamic的javascript执行性能

我想执行一个任意的用户提供的一段JavaScript代码在文件的每一行。 我创build了一个简单的节点命令行应用程序,作为一个例子,只需取每行并输出它的长度:

#!/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); }); 

性能不是最佳的。 对于一百万行文件,需要几分钟时间:

 $ time ./eachline.js 1M.txt > /dev/null real 4m14.366s user 4m12.200s sys 0m4.545s 

awk这个简单的操作大概需要五秒钟。 用一个类似的程序 ,执行任意的JavaScript超过十秒钟。

我之前没有和node一起工作过,所以上面的程序是我的第一个没有受过教育的解决scheme。 我怎么能提高性能?

编辑:上面源代码中的一个要点: 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)); }); 

这个想法是在函数中包装提供的expression式,评估脚本,然后使用函数。 我认为V8不会优化script内部的代码,因为它不应该运行多次。