【问题标题】:Timing loops with asynchronous functions具有异步功能的定时循环
【发布时间】:2016-01-06 09:48:04
【问题描述】:

是否可以在循环内使用异步函数获取循环的执行时间?

以下内容适用于同步函数,但不适用于异步:

var amount = 100; 
var start = new Date().getTime();

for(var i=0; i < amount; i++){
 // function 
}

var end = new Date().getTime();
var time = (end - start) / 1000;

如果是这样,我如何转换上面的代码,以便time 保存循环(和内部函数)运行的总时间值?

【问题讨论】:

  • 听起来像 loop 是无关紧要的,而您实际上想要分析您的异步函数...!?
  • 不,我想获取运行异步函数 X 次所需的时间。其中 X 是一个相当大的数字(1000 次)。
  • 您是否需要等待函数完成后再在测试中再次触发它,或者只是等待所有调用完成 - 即异步函数应该串行触发还是并行触发?跨度>
  • 并行,我不需要等待一个完成下一个开始。

标签: javascript node.js asynchronous


【解决方案1】:

你可以这样做;

var amount = 100; 
var completionAmount = 0;
var start = new Date().getTime();
var end, time;
var theFunction = function(){
    // bla bla
}
var calbackOfTheFunction = function(){
    //bla bla
    completionAmount++;
    if(completionAmount === 100){
        end = new Date().getTime();
        time = (end - start) / 1000;
    }
};


for(var i=0; i < amount; i++){
    theFunction(); 
}

【讨论】:

  • 谢谢,成功了。除了使用 completionAmount 之外,我可以不只在 if(...) 语句中使用 amount - 1 吗?例如if(i === (amount -1)) { .. }?
  • 在此示例中,calbackOfTheFunction 没有 i。如果你在 for 循环中将calbackOfTheFunction 传递给theFunction,当然你也可以传递i
  • 即使你有i,使用i 也可能会产生错误的结果,因为i=98 可能是最后一次触发的回调。
【解决方案2】:

你可以使用类似async.parallel:

var start = new Date().getTime();
async.parallel(arrayOfAsyncFunctions, function() {
    var end = new Date().getTime();
    var time = (end - start) / 1000;
});

所有异步函数完成后,回调将被调用。

此外,您可以使用任何其他 Promise 库,例如 q.all 或编写自己的代码来模拟此行为。

【讨论】:

  • 我已经看过了,但问题是我需要大量运行异步函数,因此需要 for 循环。有没有办法解决这个问题?
  • 当然,在这种情况下,请查看@yılmaz 答案stackoverflow.com/questions/34630006/…
【解决方案3】:

如果异步操作可以接受回调参数,则可以将计算放在回调中:

var time;
for(var i=0; i < amount; i++){
   asyncfunction(someParam, anotherParam, function () {
      var end = new Date().getTime();
      time = (end - start) / 1000;
      // do stuff with time
   }
}

【讨论】:

  • 问题在于它会在每次调用函数时触发,所以它会单独为每个调用计时,而不是所有调用,不是吗?
  • 只要start不变,end - start会给你整个时间段。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2021-08-02
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2017-10-01
  • 2022-10-21
相关资源
最近更新 更多