节点.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的时间略多于十秒。
我以前没有使用过node,所以上面的程序是我对解决方案的第一个没有根据的猜测。如何提高性能?
编辑:上面的源代码要点:https://gist.github.com/miku/31864156938fcd0c8430
目标是拥有一个可以在文件的每一行上快速运行任意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
内部的代码,因为它不应该运行多次。
相关文章:
- 函数参数中的数据与指定变量之间的任何性能差异
- 提高JQuery的性能
- 无法在通过jQuery的ajax加载的页面中执行javascript
- JavaScript执行暂时挂起页面
- 如何在ReactJS JSX中执行嵌套的if-else语句
- 当js函数's已执行
- 哪个先执行
- 在使用Polymer'加载所有json文件后执行方法;s的核心ajax
- HTML表单提交时未执行外部函数
- 从自执行函数返回函数的Javascript性能命中率
- 测量JavaScript函数的内存使用情况、执行时间和性能
- console.log会降低JavaScript执行性能
- 在视图模板中执行角度表达式会降低角度应用的性能
- 调整Phonegap的应用程序执行性能
- 节点.js动态 JavaScript 执行性能
- 出于性能原因,我是否应该避免多次执行相同的函数声明
- 如何为性能执行多个异步函数(非嵌套),但等待它们完成再继续
- 有没有可以提高JavaScript执行性能的库?
- Ng-repeat with ng-hide或在控制器中执行该工作以提高性能
- 立即执行的函数性能