Javascript 如何让Benchmark.js在每次运行我的基准代码时(而不仅仅是每个周期)进行安装/拆卸?

Javascript 如何让Benchmark.js在每次运行我的基准代码时(而不仅仅是每个周期)进行安装/拆卸?,javascript,benchmarking,benchmark.js,Javascript,Benchmarking,Benchmark.js,我正在尝试使用benchmark.js对对象的成员函数进行基准测试。测试功能因以下几个因素而变得困难: 对象的创建是异步的(我可以模拟该部分) 成员函数很昂贵 成员函数足够智能,只能运行一次 假设它看起来像这样: 分类{ 构造函数(){ //异步操作 this.expensiveValue=null; } 昂贵的操作(){ if(this.expensiveValue==null){ //做昂贵的手术 this.expensiveValue=result;//非空值 } } } 现在,我想

我正在尝试使用
benchmark.js
对对象的成员函数进行基准测试。测试功能因以下几个因素而变得困难:

  • 对象的创建是异步的(我可以模拟该部分)
  • 成员函数很昂贵
  • 成员函数足够智能,只能运行一次
假设它看起来像这样:

分类{
构造函数(){
//异步操作
this.expensiveValue=null;
}
昂贵的操作(){
if(this.expensiveValue==null){
//做昂贵的手术
this.expensiveValue=result;//非空值
}
}
}
现在,我想对
expensiveOperation
进行基准测试。但由于其局限性,我还需要在每次运行时“重置”对象

据我所知,
benchmark
不支持每次运行设置。我觉得让运行的重置部分也不是最好的做法,因为它污染了我实际尝试进行基准测试的内容

我已经看过了Benchmark.setup,但它只在每个周期执行,而不是每次运行

我错过什么了吗?是否还有另一个
基准
选项可供我使用?还是我的理解有误?

我不会接受这个答案,因为我在这个问题上没有足够的知识来100%肯定,但我确实想分享我的发现。如果这应该转移到我的问题或评论,只需给我一个评论

我认为这是不可能的,因为Benchmark.js是如何执行计时的

从我所读到的(文本和代码中的)来看,Benchmark不计算单个运行的时间和总和,而是计算在指定时间内完成的运行次数(默认值为5秒)。这避免了某些问题,如低精度计时器/时间戳、运行时优化和浮点舍入错误

因此,由于这些原因,它不能简单地减去执行每次运行设置函数所需的时间。它也不能暂停计时器以允许每次运行设置执行

出于这些原因,Benchmark.js似乎不支持每次运行的设置功能,因为这样做会给它的工作带来太多麻烦,并降低计时精度。

我不会接受这个答案,因为我没有足够的知识来100%肯定这个问题,但我确实想分享我的发现。如果这应该转移到我的问题或评论,只需给我一个评论

我认为这是不可能的,因为Benchmark.js是如何执行计时的

从我所读到的(文本和代码中的)来看,Benchmark不计算单个运行的时间和总和,而是计算在指定时间内完成的运行次数(默认值为5秒)。这避免了某些问题,如低精度计时器/时间戳、运行时优化和浮点舍入错误

因此,由于这些原因,它不能简单地减去执行每次运行设置函数所需的时间。它也不能暂停计时器以允许每次运行设置执行


出于这些原因,Benchmark.js似乎不支持每次运行的设置功能,因为这样做会给它的工作带来太多麻烦,并降低计时精度。

我不熟悉Benchmark.js,但我认为这是为了能够完成您的要求(重置由静态方法(如单例或记忆)设置的状态)需要重置整个运行时环境。如果这是一个node.js环境,这意味着分叉子进程只是为了清除上下文。我不知道在浏览器上下文中如何实现这一点。我不熟悉benchmark.js,但我认为这能够实现您的要求(重置由静态方法(如单例或记忆)设置的状态)将需要重置整个运行时环境。如果这是node.js环境,则意味着分叉子进程只是为了清除上下文。我不知道在浏览器上下文中如何实现这一点。我可以确认情况确实如此。事实上,维护人员说不能,并解决了问题。我可以确认这是ca事实上,维护人员说不能,并解决了这个问题。你提出了一个很好的观点,我应该考虑功能并对其进行基准测试。我试图使用该功能所在的现有对象,但我不是对该对象进行基准测试,而是对其功能进行基准测试。现在我只需要记住我所做的需要很高兴能为您提供帮助。您的脚注中有一条注释成为标题:由于缺少高分辨率计时器,无法创建循环来测量执行时间(请参阅:)这就是从一开始就接近
Benchmark.js
的原因,也是
Benchmark.js
工作得如此好的原因。计时器中的精度不足在整个周期内进行摊销,因此
0.1s
超过
10000
执行的舍入误差变成了
0.000001s
与单次运行t的差值他说function.True。我有一个例子,我需要为被基准测试的函数生成随机输入,但我不想将其包含在度量中。我最终提前生成了50k个输入,传递给Benchmark.js的闭包只需从数组中拾取下一个输入(每50k循环一次到开始).但在你的情况下,考虑到“昂贵”功能,高分辨率不会有什么意义。我将脚注移到顶部,因为我后来意识到它们直接解决标题问题,不应该是脚注。鉴于网站的性质,对未来读者来说有意义是很重要的。你的观点很好,我应该考虑到功能和基准。我当试图使用一个现有的对象时,函数