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



我知道正式的描述:

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

但是,为什么这是必要的,尤其是在基准测试中.js?为什么需要不同的测试周期(如本文的基准测试.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 个循环,循环是外部循环(?

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

设置和拆卸是指放置代码的地方,这些代码 (1( 需要在要进行基准测试的函数之前或之后运行,但 (2( 不想包含在基准测试的测量中。

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

  1. searchEngine = new New SearchEngine(pathToLargeCorpusOfText)
  2. searchEngine.search(queryString)
  3. searchEngine.close()- 解除分配内存

如果要单独对search()方法进行基准测试,即(1(和(3(不影响结果,请分别将它们放入设置和拆卸中。

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

相关内容

  • 没有找到相关文章

最新更新