我正在尝试使用Benchmark.js对对象的成员函数进行基准测试。由于以下几个因素,测试该功能很困难:
假设它看起来是这样的:
class Something {
constructor(){
// async ops
this.expensiveValue = null;
}
expensiveOperation () {
if (this.expensiveValue === null) {
// Do expensive operation
this.expensiveValue = result; // a non-null value
}
}
}现在,我想对expensiveOperation进行基准测试。但是由于它的局限性,我也需要“重置”每次运行的对象。
据我所知,benchmark不支持每次运行的设置。我觉得让重置部分的运行也不是最好的做法,因为它污染了我真正想要的基准。
我看过Benchmark.setup,但它只在每一个周期执行,而不是每次运行。
我是不是遗漏了什么?我还可以使用另一个benchmark选项吗?还是我走错路了?
发布于 2020-04-29 05:20:22
你不能总是得到你想要的..。♩
Benchmark.js不会在函数的每一次迭代中执行setup/teardown,而是只对每个benchmark.js setup执行,这通常是它可以在5秒内运行的任何东西,这可能是几百到数百万次调用。它这样做是有很好的理由的,正如“Benchmark.js in 防弹JavaScript基准”的作者所解释的。
如果你认为这些理由不适用于你,那么我会问你为什么要使用Benchmark.js。您可以轻松地编写一个循环,并测量每个调用的持续时间,并在少量代码行中自己计算平均值。你不需要一个漂亮的图书馆。
你不能总是得到你想要的
如果你有时间尝试,你可能会发现
你得到了你所需要的♫。*♬♪
老实说,是的,你这样做是不对的。您的expensiveOperation ()被设计成对所有后续调用都是有效的,因此当然,一个好的基准应该反映这一点。第一次呼叫的费用在随后的所有呼叫中摊销。Benchmark.js将尝试按照设计来衡量您的方法的效率。这就是问题所在。
想想你的潜在目标,以及为什么你想要为每一次迭代重置。您不想对expensiveOperation ()进行基准测试,但是只想对该方法的这一部分进行测试:
// Do expensive operation
this.expensiveValue = result; // a non-null value因此,只需将其考虑到一个方法或函数中,并对其进行基准测试。:)
发布于 2020-02-03 22:00:41
我不会接受这个答案,因为我在这个问题上没有足够的知识,不能百分之百肯定,但我确实想分享我的发现。如果这应该转移到我的问题或评论,只需给我一个评论。
我认为这不可能的原因是因为Benchmark.js如何执行它的计时。
根据我所读到的(在文本和代码中),Benchmark并不是单个运行的时间和总和,而是计算在指定的时间内完成了多少次运行(默认为5秒)。这避免了某些问题,如低精度计时器/时间戳、运行时优化和浮点舍入错误。
因此,由于这些原因,它不能简单地减去执行每次运行的安装函数所需的时间。它也不能暂停其计时器以允许每次运行的安装程序执行。
由于这些原因,Benchmark.js似乎不支持每次运行的安装函数,因为这样做会给它的工作带来太多麻烦,降低计时的准确性。
https://stackoverflow.com/questions/59971998
复制相似问题