为什么超时599147937792比0快?

时间:2014-03-18 16:14:34

标签: javascript

我发现自己在这个jsperfs'页面,为什么会这样?

JSPerf smallest timeout

任何线索? 为什么4也比0快?

2 个答案:

答案 0 :(得分:2)

对此有评论,你应该仔细阅读这篇文章。

Info

The smallest setTimeout timeout value allowed by the HTML5 specification is 4 ms. Smaller
values should clamp to 4 ms.

Therefore, the first two tests below should have about the same result.

P.S. Some browsers freak out when you use a value greater than 599147937791 for the 
timeout (i.e. they use 0 or 4 ms instead), hence the last test.

基本上,Javascript对0599147937792进行了内部处理,因为它们有资格获得setTimeout的上/下溢值,并且它们四舍五入为默认的最小接受值4女士。这可能是因为要求0 ms延迟是不合理的,因为甚至可能需要更长的时间来处理函数并确定这是用户想要的。较大值的错误可能是由于计算机限制了您可以表示的数字的大小。

要理解为什么在4之后大小值返回的原因是内部处理也需要时间,这是一个非常小的数量,但是时间。考虑以下两个时间表:

时间表1

  1. setTimeout(...,0)被称为
  2. 该函数检查边界条件(类似if (time < 4) {// use 4}
  3. 此功能需要额外一步来更改0 -> 4
  4. 中的值
  5. 现在设置4 ms
  6. 的超时时间

    时间表2

    1. setTimeout(...,4)被称为
    2. 该函数检查边界条件(类似if (time < 4) {// use 4}
    3. 一切都好,继续前进。
    4. 现在设置4 ms
    5. 的超时时间

      在第一种情况下,两个时间轴中的步骤3需要更长的时间,因为有更改值的额外步骤。两者都会等待相同的时间,但第二个将会更快地开始计时。这与599147937792大致相同,除了检查将是上限。

      短语"freaks out"让我觉得它看起来更像是

      try { 
          // try with the given input
      } catch (Exception) {
          // Ahh I freaked out, just use 4 instead!!!!111!!!
      }
      

答案 1 :(得分:1)

来自MDN

  

浏览器(包括Internet Explorer,Chrome,Safari和Firefox)将延迟存储为内部32位有符号整数。当使用大于2147483647的延迟时,这会导致整数溢出,导致超时立即执行