【问题标题】:Benchmark Asynchronous Code (Benchmark.js, Node.js)基准异步代码(Benchmark.js、Node.js)
【发布时间】:2015-10-15 22:11:28
【问题描述】:

我想使用Benchmark.js 模块来测试一些用node.js 编写的异步代码。具体来说,我想向两台服务器发出大约 10,000 个请求(一个用 node 编写,一个用 PHP 编写),并跟踪每台服务器完成所有请求所需的时间。

我打算编写一个简单的节点脚本来使用 Benchmark 触发这些请求,但我对如何将它与异步代码一起使用有点困惑。通常在节点模块中,当您的异步代码完成时,您会调用某种回调,或者从函数返回 Promise 等。但是对于 Benchmark,从我在文档中阅读的所有内容来看,它似乎没有完全处理异步。

有人知道我应该做什么或看什么吗?如果需要,我可以手动编写基准;这似乎是一个足够常见的用例,Benchmark 或其他人可能已经在他们的专业级测试库中实现了它。

感谢您的任何指导, 〜内特

【问题讨论】:

    标签: javascript node.js asynchronous benchmark.js


    【解决方案1】:

    没有很好的文档记录,但这里有一个 PoC:

    var Benchmark = require('benchmark');
    var suite     = new Benchmark.Suite();
    
    suite.add(new Benchmark('foo', {
      // a flag to indicate the benchmark is deferred
      defer : true,
    
      // benchmark test function
      fn : function(deferred) {
        setTimeout(function() {
          deferred.resolve();
        }, 200);
      }
    })).on('complete', function() {
      console.log(this[0].stats);
    }).run();
    

    Benchmark.js v2 稍微改变了语法:

    var Benchmark = require('benchmark');
    var suite = new Benchmark.Suite;
    
    suite.add('foo', {
      defer: true,
      fn: function (deferred) {
        setTimeout(function() {
          deferred.resolve();
        }, 200);
      }
    }).on('complete', function () {
      console.log(this[0].stats)
    }).run()
    

    【讨论】:

    • 哦,好吧 - 我确实看到了延迟对象;没有意识到那是它的用途。谢谢!
    • 是的,就像我说的,它没有很好的文档记录 :-( FWIW,我刚刚推送了 benchr 的第一个版本,它是 Benchmark.js 的类似 Mocha 的包装器,用于制作东西更容易一些。不过它仍然是一个 WIP。
    • 哦,太棒了 - 我喜欢 mocha,而且你的语法肯定非常熟悉。我会试一试的。 benchr和bencha有什么区别?
    • @opensourcejunkie AFAIK,bencha 根本不支持异步测试用例。我也不喜欢它要求你创建一个bench/ 目录的方式,而且它也是不可配置的。
    • 明白了,谢谢。我昨天试过了,我也对配置选项不感兴趣(例如,它总是运行 index.js 而不是提供 mocha --grep 之类的东西)。它确实支持异步,与 mocha 的风格相同——在测试函数参数中指定的完成回调。感谢您的所有帮助,我期待在 repo 中看到您的解决方案!
    【解决方案2】:

    我在尝试测试异步函数时遇到了同样的问题。这是我最终在Code Sand Box 上使用的示例。这是基准文档的link,其中给出了使用defer 属性的示例。

    这里是我在 Node.js 中使用的代码,供任何前来并希望看到 defferedasync/await 一起使用的人使用。我希望有人觉得这很有用!

    const Benchmark = require('benchmark');
    const suite = new Benchmark.Suite();
    const promiseCount = 10;
    const setupArray = Array.from(Array(promiseCount)).map((_, i) => i);
    
    const sleep = (ms = 500) =>
      new Promise(resolve => {
        setTimeout(() => {
          resolve();
        }, ms);
      });
    
    const asyncFunction = async (name, index) => {
      await sleep(100);
      return `${name}_${index}`;
    };
    
    suite
      .add("Promise.all", {
        defer: true,
        fn: async function(deferred) {
          const promiseArray = setupArray.map(asyncFunction);
          await Promise.all(promiseArray);
          deferred.resolve();
        }
      })
      .add("For loop", {
        defer: true,
        fn: async function(deferred) {
          const final = [];
    
          for (let i = 0; i < promiseCount; i++) {
            const data = await asyncFunction(setupArray[i], i);
            final.push(data);
          }
          deferred.resolve();
        }
      })
      .on("cycle", function(event) {
        console.log(String(event.target));
      })
      .on("complete", function() {
        console.log("Fastest is " + this.filter("fastest").map("name"));
      })
      .run({ async: true });
    

    【讨论】:

      猜你喜欢
      • 2017-02-04
      • 2015-01-11
      • 2016-07-31
      • 1970-01-01
      • 1970-01-01
      • 2013-11-27
      • 1970-01-01
      • 2022-01-22
      • 1970-01-01
      相关资源
      最近更新 更多