首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >为什么settimeout()序列会影响性能?

为什么settimeout()序列会影响性能?
EN

Stack Overflow用户
提问于 2017-07-31 13:03:28
回答 1查看 373关注 0票数 0

有两个类似的javascript程序A和B(Chrome59.0.3071.115(64位)测试).The程序引用到调度: setTimeout和setInterval

程序A:(运行5858 run)

代码语言:javascript
运行
复制
<script type="text/javascript">
let i = 0;
let start = Date.now();

function count() {

  // move the scheduling at the beginning
  if (i < 1e9 - 1e6) {
    setTimeout(count, 0); // schedule the new call
  }

  do {
    i++;
  } while (i % 1e6 != 0);

  if (i == 1e9) {
    alert("Done in " + (Date.now() - start) + 'ms');
  }

}

count();

</script>

程序B(运行大约11294ms)

代码语言:javascript
运行
复制
<script type="text/javascript">

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, 0); // schedule the new call (**)
      }


    }

    count();

    </script>

程序C(大约运行A)

代码语言:javascript
运行
复制
<script>
    let i = 0;
    let start = Date.now();

    function count() {

      if (i == 1e9) {
        alert("Done in " + (Date.now() - start) + 'ms');
      } else {
        setTimeout(count, 0); // schedule the new call (**)
      }
    // do a piece of the heavy job (*)
      do {
        i++;
      } while (i % 1e6 != 0);

    }
    count();
</script>

我知道javascript是单线程,而settimeout只是在指定的delay.Compare两段代码之后推入队列来执行,我不明白为什么程序A比程序B在单线程下速度更快。

我就是这么想的,excuteQueue.jpg

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2017-07-31 13:16:15

基本的区别是:

代码语言:javascript
运行
复制
1)sets a timer, does a heavy job
2)does a heavy job, sets a timer

正如Pointy指出的那样,0ms定时器等待的时间总是比0ms长,所以基本上是这样的:

代码语言:javascript
运行
复制
1)
*sets a timer   |
*do heavy job  |
*                       \/
* timer finishes, next job

2)
*do a heavy job
*sets a timer |
*                      |
*                     \/
* timer finishes, next job

正如你所看到的,第二个会产生更长的时间。

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/45416725

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档