为什么需要设置和拆卸?

时间:2018-05-22 15:30:30

标签: javascript unit-testing benchmarking benchmark.js

我知道正式的描述:

  

设置:创建测试的预期状态   拆解:进行必要的清理操作。

然而,为什么这是必要的,特别是在Benchmark.js?为什么需要不同的测试周期(如this文章中的Benchmark.js中所定义)? 我观察到在所有情况下我都能想到(并且我认为在所有其他情况下),你可以将设置代码移动到准备代码(基准/测试之外的代码),也许是代码末尾的代码拆解,功能基本相同(我也看了几个jsperf.com测试,据我所知,这也适用于他们。)

例如,这是我创建的基准测试,此版本使用Setups和Teardowns:

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

相同的例子,除了,测试所需的所有内容都与页面的其余部分一起声明:

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

也许单元测试中的差异更明显?我不知道。你能否提供一些与众不同的案例?或解释为什么测试必须在循环内运行的迭代中运行(基本上,如2个循环,循环是外循环)?

我可以在网上找到关于这个主题的所有内容基本上是对不同措辞的设置和拆解定义的再次发表,不幸的是,这个主题没有维基百科条目。

1 个答案:

答案 0 :(得分:1)

设置和拆卸是在其中放置以下代码:(1)需要在要进行基准测试的函数之前或之后运行,但(2)不想包括在基准测试的度量范围内。

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

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

如果要单独对search()方法进行基准测试,即在不影响(1)和(3)影响结果的情况下,则分别将其置于设置和拆卸状态。

要准确地对功能进行基准测试,它必须运行多次。 Benchmark.js每个周期运行许多迭代(一次调用search()),并为每个基准运行多个周期。我无法解释原因,比Mathias Bynens和John-David Dalton的Benchmark.js:Bulletproof JavaScript benchmarks的作者还要好。