我知道正式的描述:
Setup:创建测试的预期状态。拆卸:进行必要的清理操作。
但是,为什么这是必要的,尤其是在Benchmark.js中?为什么需要不同的测试周期(如this文章中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的定义,不幸的是,该主题没有Wikipedia条目。
安装和拆卸是您放置以下代码的地方:(1)需要在要进行基准测试的函数之前或之后运行,但(2)不想包括在基准测试的度量范围内。
例如,假设您有一个文本搜索库。用法如下:
searchEngine = new New SearchEngine(pathToLargeCorpusOfText)
searchEngine.search(queryString)
searchEngine.close()
-释放内存如果要单独对search()
方法进行基准测试,即在不影响(1)和(3)影响结果的情况下,则分别将其置于设置和拆卸状态。
要准确地对功能进行基准测试,它必须运行多次。 Benchmark.js每个周期运行许多迭代(一次调用search()
),并为每个基准运行多个周期。我无法比Benchmark.js的作者更好地解释原因:Bulletproof JavaScript benchmarks Mathias Bynens和John-David Dalton。