关于settimeout:使用-setTimeout-拆解一些-CPU-密集型的执行任务

未优化之前的版本: let i = 0;let start = Date.now();function count() { // do a heavy job for (let j = 0; j < 1e9; j++) { i++; } alert("Done in " + (Date.now() - start) + 'ms');}count();上述 count 函数里的 for 循环的 i 累加,是一个 CPU 密集型工作,在执行结束之前,JavaScript 引擎工作队列里的其余工作,没有机会失去执行。 优化版本将 i 从 1 累加到 1e9 的工作,拆解成 1000 个小的子工作。每个子工作执行结束之后,调用 setTimeout 调度本身,这样工作队列里其余工作有机会失去执行。 let i = 0;let start = Date.now();function count() { // do a piece of the heavy job (*) do { i++; } while (i % 1e6 != 0); if (i == 1e9) { alert("Done in " + (Date.now() - start) + 'ms'); } else { setTimeout(count); // schedule the new call (**) }}count();第一轮工作执行:i=1...1000000第二轮工作执行:i=1000001..2000000以此类推。 ...

May 13, 2022 · 2 min · jiezi