Javascript 如何对Node.js流进行基准测试?

Javascript 如何对Node.js流进行基准测试?,javascript,node.js,benchmarking,Javascript,Node.js,Benchmarking,如何在Node.js中进行基准测试 我试过: 但是我得到了错误 Unhandled stream error in pipe 您的代码遇到此错误,您可以通过侦听读写器上的错误来查看: [Error: EMFILE, open 'out.txt'] errno: 20, code: 'EMFILE', path: 'in.txt' [Error: EMFILE, open 'out.txt'] errno: 20, code: 'EMFILE', path: 'out.txt' 这是因为流是异

如何在Node.js中进行基准测试

我试过:

但是我得到了错误

Unhandled stream error in pipe

您的代码遇到此错误,您可以通过侦听读写器上的错误来查看:

[Error: EMFILE, open 'out.txt'] errno: 20, code: 'EMFILE', path: 'in.txt'
[Error: EMFILE, open 'out.txt'] errno: 20, code: 'EMFILE', path: 'out.txt'
这是因为流是异步的,并且在结束时没有显式回调。因此,您几乎在in.txt和out.txt之间创建成千上万的管道流,直到系统告诉您它们打开的文件太多

所以,我猜通过“在节点中对流进行基准测试”,您想要计算的是同步执行此操作所需的时间:

reader.pipe(filter).pipe(writer)
在这种情况下,您需要:

  • 使用benchmark的defer选项
  • 管道作业结束后,请确保安全
这个答案的代码已经在节点0.10.0上进行了测试,但我想唯一的区别应该是保存
Transform
的模块的名称:

var fs = require('fs');
var util = require('util');
var Transform = require('stream').Transform;
var Benchmark = require('benchmark');
var suite = new Benchmark.Suite;

var i = 0;

// my super uppercase stream
function Uppercase(options) {
  if (!(this instanceof Uppercase))
    return new Uppercase(options);

  Transform.call(this, options);
}

Uppercase.prototype = Object.create(
  Transform.prototype, { constructor: { value: Uppercase }}
);

Uppercase.prototype._transform = function(chunk, encoding, done) {
  chunk = chunk.toString().toUpperCase();
  this.push(chunk)
};



// start benchmarking
suite.add('stream test', {
  'defer' : true,
  'fn' : function (deferred) {
    var reader = fs.createReadStream('in.txt');
    var parser = new Uppercase();
    var writer = fs.createWriteStream('out.txt');

    reader.on('error', function (err) {
      console.log(err);
    });
    writer.on('error', function (err) {
      console.log(err);
    });
    reader.on('end', function  (argument) {
      // Wait until reader is over and then close reader and finish deferred test
      writer.end();
      deferred.resolve();
    });

    reader.pipe(parser).pipe(writer, {'end': false});
  }
})

//  listeners
.on('cycle', function(event) {
  console.log(String(event.target));
})
.on('complete', function() {
  console.log('Fastest is ' + this.filter('fastest').pluck('name'));
})

// run async
.run();

你确定这个问题与基准测试有关吗?换句话说,
var reader=fs.createReadStream('In.txt');var parser=new大写();var writer=fs.createWriteStream('out.txt');reader.pipe(解析器)、pipe(writer)在基准之外尝试时抛出相同的错误?刚才看到我调用了两次
run()
,但这不是错误@MathiasBynens代码在基准环境之外运行良好。我还为
读取器
添加了一个
错误
事件处理程序。现在初始错误消失了,我得到
[错误:好的,打开'my\path\to\data.json'
您的节点版本是什么,您使用的是哪个操作系统?节点v0.8.18和mac OS v10.7.5看起来不错。今晚将尝试代码。认为异步操作可能会导致问题,但不知道
延迟
选项。谢谢!只是一个小的改进:调用
延迟。解决()
parser.on('end',function(){})
而不是
reader.on('end')
因为后者可能会在我的
解析器
完成之前关闭
编写器
。我仍然没有找到原因的答案。但是解析器不会发出结束信号。即使我们像这样调用函数
reader.pipe(parser,{'end':false}).pipe(writer,{'end':false});
。我将更深入地研究它。在我们的例子中,解析器不会发出任何事件。我尝试了所有可读写流事件,但什么都没有。我实际上不确定它是否是一个功能。
var fs = require('fs');
var util = require('util');
var Transform = require('stream').Transform;
var Benchmark = require('benchmark');
var suite = new Benchmark.Suite;

var i = 0;

// my super uppercase stream
function Uppercase(options) {
  if (!(this instanceof Uppercase))
    return new Uppercase(options);

  Transform.call(this, options);
}

Uppercase.prototype = Object.create(
  Transform.prototype, { constructor: { value: Uppercase }}
);

Uppercase.prototype._transform = function(chunk, encoding, done) {
  chunk = chunk.toString().toUpperCase();
  this.push(chunk)
};



// start benchmarking
suite.add('stream test', {
  'defer' : true,
  'fn' : function (deferred) {
    var reader = fs.createReadStream('in.txt');
    var parser = new Uppercase();
    var writer = fs.createWriteStream('out.txt');

    reader.on('error', function (err) {
      console.log(err);
    });
    writer.on('error', function (err) {
      console.log(err);
    });
    reader.on('end', function  (argument) {
      // Wait until reader is over and then close reader and finish deferred test
      writer.end();
      deferred.resolve();
    });

    reader.pipe(parser).pipe(writer, {'end': false});
  }
})

//  listeners
.on('cycle', function(event) {
  console.log(String(event.target));
})
.on('complete', function() {
  console.log('Fastest is ' + this.filter('fastest').pluck('name'));
})

// run async
.run();