繁体   English   中英

node.js动态javascript执行性能

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

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM