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

时间:2019-11-19 03:55:28

标签: javascript performance quicksort

我正在用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, a, 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毫秒才能运行。

1 个答案:

答案 0 :(得分:0)

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上找到了解决方案。由于这是一个可视化项目,而不是计时器建议的解决方案,效果很好。