使延迟发生延迟的JS异步帮助程序功能

我正在用JavaScript编写排序算法可视化工具。到目前为止,代码可以正常工作,但是仍然存在性能问题。

我正在尝试使交换功能运行1毫秒(speed.value)。但是,除了前4个交换,每个交换调用平均需要4毫秒才能解决。代码如下所示:

async function bubbleSort(arr,start,end) {
  for (i = start; i < end; i++) {
    for (j = start; j < end - i - 1; j++) {
      if (arr[j].val > arr[j + 1].val) {
        await swap(arr,j,j + 1);
      }
    }
    j = 0;
  }
}

async function swap(arr,a,b) {
  var t3 = performance.now();
  await delay(speed.value);
  Bars_c.push({ a,b });
  var temp = arr[a].val;
  arr[a].val = arr[b].val;
  arr[b].val = temp;
  swapOnGraph(arr,b);
  var t4 = performance.now();
  console.log(t4 - t3);
}



function delay(ms) {
  return new Promise(resolve => setTimeout(resolve,ms));
}

没有“ await delay(speed.value)”,每个交换只需不到一毫秒即可完成。并且仅测试该函数就表明它在交换之外可以按预期工作,因此delay()重写似乎毫无意义。如何更改代码,以便每次交换需要1毫秒才能运行。

cjq790323 回答:使延迟发生延迟的JS异步帮助程序功能

SetTimeout方法确实是瓶颈,可以通过运行以下代码来证明:

var results = 0,iterations = 1000,i = 0;

function go() {
    var fn = function () {
            results += new Date().getTime() - d;
            i += 1;
            if (i < iterations) {
                go();
            } else {
                finish();
            }
        },d = new Date().getTime();
    setTimeout(fn,0);
}

平均时间将取决于浏览器,而Pointy感到遗憾的是,它最多可以达到16毫秒。对于这个问题,我在stack-exchange上找到了解决方案。由于这是一个可视化项目,而不是计时器建议的解决方案,效果很好。

本文链接:https://www.f2er.com/3076464.html

大家都在问