Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/javascript/406.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/unit-testing/4.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Javascript 为什么在Benchmark.js中设置、拆卸和循环的目的是什么?_Javascript_Unit Testing_Benchmarking_Benchmark.js - Fatal编程技术网

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

Javascript 为什么在Benchmark.js中设置、拆卸和循环的目的是什么?,javascript,unit-testing,benchmarking,benchmark.js,Javascript,Unit Testing,Benchmarking,Benchmark.js,我知道正式的描述: 设置:为测试创建预期状态。 拆卸:进行必要的清理操作 然而,为什么这是必要的,尤其是在Benchmark.js中?为什么需要不同的测试周期(如本文中Benchmark.js中所定义的)? 我已经观察到,在我能想到的所有情况下(我也认为在所有其他情况下),您可以将设置代码移到准备代码(基准/测试之外的代码),或者将拆卸代码移到代码的末尾,并且功能基本相同(我也看过一些jsperf.com测试,据我所知,它们也是如此) 例如,我创建了一个基准测试,该版本使用设置和拆卸: cons

我知道正式的描述:

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

然而,为什么这是必要的,尤其是在Benchmark.js中?为什么需要不同的测试周期(如本文中Benchmark.js中所定义的)? 我已经观察到,在我能想到的所有情况下(我也认为在所有其他情况下),您可以将设置代码移到准备代码(基准/测试之外的代码),或者将拆卸代码移到代码的末尾,并且功能基本相同(我也看过一些jsperf.com测试,据我所知,它们也是如此)

例如,我创建了一个基准测试,该版本使用设置和拆卸:

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个循环,循环是外部的循环)


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

Setup和Teardown是在这里放置代码的地方,(1)需要在要进行基准测试的函数之前或之后运行,但是(2)不希望包括在基准的度量中

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

  • searchEngine=new-new搜索引擎(pathToLargeCorpusOfText)
  • searchEngine.search(queryString)
  • searchEngine.close()
    -释放内存
  • 如果要单独对
    search()
    方法进行基准测试,即在不影响(1)和(3)结果的情况下,可以将它们分别放在setup和teardown中


    为了准确地对函数进行基准测试,它必须运行多次。benchmark.js每个周期运行多次迭代(一次调用
    search()
    ),并为每个基准测试运行许多周期。我无法解释比benchmark.js的作者Mathias Bynens和John David Dalton更好的原因。

    一个很大的区别(这会影响性能)是
    players
    ticTacToe
    @Bergi的作用域,这就是为什么第二个示例较慢的原因吗?哦,在您的示例中,它显示了,是的!访问全局变量比访问局部作用域变量慢(因为编译器可以更轻松地内联后者)。我的意思是“在调用benchmark.js之前”@doubleport只是简单地说,每次运行都会得到自己的、新生成的数据。这将提供更好的结果和更高的一致性。