首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >为什么在Benchmark.js中设置、拆卸和循环的目的?

为什么在Benchmark.js中设置、拆卸和循环的目的?
EN

Stack Overflow用户
提问于 2018-05-22 15:30:29
回答 1查看 294关注 0票数 5

我知道正式的描述:

Setup:为测试创建预期状态。 Teardown:做必要的清理操作.

然而,为什么这是必要的,特别是在Benchmark.js中?为什么需要不同的测试周期(如Benchmark.js在文章中所定义的)?我观察到,在所有我能想到的情况下(在所有其他情况下也是如此),您只需将设置代码移动到准备代码(基准/测试之外的代码),或者将删除代码移到代码的末尾,功能基本上是相同的(我也看过几个jsperf.com测试,据我所知,它们也是如此)。

例如,下面是我创建的一个基准测试,这个版本使用的是设置和删除:

代码语言:javascript
复制
const bench = new Benchmark(
  'TicTacToeBenchmark',
  // The function to test
  () => {
    ticTacToe.addEvent(
      'turn',
      player => {
        turnText.innerHTML =
          'It\'s ' + (player['id'] === 1 ? 'X' : 'O') + '\'s turn.';
      }
    );
  },
  {
    'setup': () => {
      const players = [
        {
          char: '✕',
          className: 'playerX',
          id: 1,
        },
        {
          char: '◯',
          className: 'playerY',
          id: 2,
        },
      ];
      const ticTacToe = new TicTacToe(3, players);
    }
  }
);

bench.run();

console.log(bench); // 'mean' is 5e-7 seconds

除了在页面的其余部分声明测试所需的所有内容外,其他示例都声明了测试所需的一切:

代码语言:javascript
复制
const players = [
  {
    char: '✕',
    className: 'playerX',
    id: 1,
  },
  {
    char: '◯',
    className: 'playerY',
    id: 2,
  },
];
const ticTacToe = new TicTacToe(3, players);

const bench = new Benchmark(
  'TicTacToeBenchmark',
  // The function to test
  () => {
    ticTacToe.addEvent(
      'turn',
      player => {
        turnText.innerHTML =
          'It\'s ' + (player['id'] === 1 ? 'X' : 'O') + '\'s turn.';
      }
    );
  }
);

bench.run();

console.log(bench); // 'mean' is 7e-7 seconds

也许在单元测试中,两者的区别更明显?我不知道。你能提供几个不同的案例吗?或者解释为什么测试必须在循环内运行的迭代中运行(本质上,就像两个循环,循环是外部循环)?

我在网上找到的关于这个主题的所有内容基本上都是对不同措辞的设置和Teardown定义的重复,不幸的是,这个主题没有维基百科条目。

EN

回答 1

Stack Overflow用户

发布于 2020-04-29 06:43:18

安装和拆卸是将代码放在(1)需要在要对其进行基准测试的函数之前或之后运行的代码,但是(2)不希望包含在基准测试的度量中。

例如,假设您有一个文本搜索库。用法如下:

  1. searchEngine = new New SearchEngine(pathToLargeCorpusOfText)
  2. searchEngine.search(queryString)
  3. searchEngine.close() -释放内存

如果您希望隔离地对search()方法进行基准测试,即不影响结果的(1)和(3),则分别将它们放在安装程序和拆卸中。

要准确地对函数进行基准测试,必须多次运行它。Benchmark.js每个周期运行多个迭代(一个search()调用),并为每个基准运行多个循环。我无法比马蒂亚斯·拜恩斯( Mathias )和约翰·大卫·道尔顿(John)的作者更好地解释原因。

票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/50471459

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档