成人免费xxxxx在线视频软件_久久精品久久久_亚洲国产精品久久久_天天色天天色_亚洲人成一区_欧美一级欧美三级在线观看

setTimeout的誤差堆積測試和分析

開發 后端
文章主要是對setTimeout的誤差堆積測試和簡單分析,根據JS的引擎,setTimeout可能存在一定的時間誤差,長時間的誤差堆積將出現較大的偏離值,所以根據一些例子做了一個簡單的模擬誤差堆積測試。

前段時間做了一個團購秒殺倒計時的js展現的例子(http://www.blogjava.net/dongbule/archive/2011/12/06/365687.html),倒計時的方式主要使用setTimeout的函數進行遞歸實現,由于是使用setTimeout,所以根據js的引擎,這其中將可能存在一定的時間誤差,一個誤差不要緊,兩個誤差無所謂,但長時間的誤差堆積將出現較大的偏離值,所以根據秒殺倒計時的例子,做了一個簡單的模擬的誤差堆積測試,并在各個瀏覽器中進行測試。
鑒于秒殺倒計時都是以一秒為單位,所以下面的例子也都以1000毫秒為計算,當然各個瀏覽器的實現和附加代碼的編寫也會造成一定的時間誤差,這部分誤差也合并在setTimeout的實現里面計算誤差。

  1. <div id="show" style="width:500px;"></div>  
  2. <script>  
  3. var w = 1000;  
  4. var second = 0;  
  5. function showtime(){      
  6. showtime.curr=  +new Date();      
  7. setTimeout('showtime()',1000);      
  8. document.getElementById("show").innerHTML+=second +"    "+(showtime.curr-(showtime.last||showtime.curr)-1000)+"    <br/>";      
  9. showtime.last=showtime.curr;      
  10. second++;  
  11. }  
  12. showtime();  
  13. </script> 

可以看到在各個不同的瀏覽器在不同的秒數中出現不同的誤差,當然這個跟我本機的瀏覽器和環境有關

下面再將這些誤差值進行疊加測試

  1. <div>  
  2. <div id="show" style="width:500px;"></div>  
  3. </div>  
  4. <script>  
  5. var w = 1000;  
  6. var i = 0;  
  7. function showtime(){  
  8.     showtime.curr=  +new Date();  
  9.     f = setTimeout('showtime()',1000);  
  10.     w+=(showtime.curr-(showtime.last||showtime.curr)-1000);  
  11.     document.getElementById("show").innerHTML+=i+"   "+(showtime.curr-(showtime.last||showtime.curr)-1000)  +"    "+w+"   
  12.  
  13. <br/>";  
  14.     showtime.last=showtime.curr;  
  15.     i++;  
  16. }  
  17. showtime();  
  18. </script> 

 

IE和chrome相對較為穩定,不知道是不是我本機環境的原因,firefox出現了很多大偏差,可以選擇定時清空這個誤差值來處理,或是采用鏈式的setTimeOut()來處理。

  1. <div id="show" style="width:300px;"></div>  
  2. <script>  
  3. var w = 1000;  
  4. var i = 0;  
  5. var f ;  
  6. var t ;  
  7. var k = 0;  
  8. function showtime(){  
  9.     showtime.curr=  +new Date();  
  10.     f = setTimeout('showtime()',1000);  
  11.     w+=(showtime.curr-(showtime.last||showtime.curr)-1000);  
  12.     document.getElementById("show").innerHTML+=i+"   "+w+"  "+(showtime.curr-(showtime.last||showtime.curr)-1000)  +"    <br/>";  
  13.     showtime.last=showtime.curr;  
  14.     i++;  
  15. }  
  16. function round(){  
  17.     if(k!=0){  
  18.         clearTimeout(f);  
  19.         showtime();  
  20.         document.getElementById("show").innerHTML+="  clear<br/>";  
  21.         w=0;  
  22.     }  
  23.     setTimeout('round()',10000);  
  24.     k++;  
  25. }  
  26. showtime();  
  27. round();  
  28. </script> 

其實為什么javascript的定時器會出現所謂的不可靠或偏差的情況,這是可以理解的,最主要的問題是它們并不是所謂的線程,其實
javascript是運行于單線程的環境中,而定時器只是計劃代碼在未來某個執行的時間,執行的時間點是不能被保證的,因為在頁面的生命周期中,不同時間可能存在其他代碼,或各個瀏覽器的內核控制住javascript進程。

settimeout幾個見解

1、setTimeOut != thread | 時間片的并發調用

2、javascript以單線程的方式運行于瀏覽器的javascript引擎中

3、setTimeout 只是把要執行的代碼在設定的時間點插入js引擎維護的代碼隊列

4、setTimeout 插入代碼隊列并不意味著代碼就會立馬執行的

  1. function showtime(){  
  2. // code 1...  
  3. f = setTimeout('showtime()',200); //200毫秒后要插入執行代碼對瀏覽器的js隊列  
  4. // code 2...  

以上面面的代碼為例,說說它的執行流程

Code 1 -> 200毫秒后通知瀏覽器有隊列插入 -> Code 2 -> showtime() -> …

這個種重復遞歸可能會造成2個問題:

1 . 時間間隔可能小于定時調用的代碼的執行時間

2 . 時間間隔或許會跳過

5ms : code1 代碼執行完畢,200ms后有定時器進入隊列

205ms : 定時器進入隊列,code2繼續

300ms : function代碼結束,定時器從隊列中取出,執行

405ms : 第二個定時器進入隊列,第一個定時器的代碼在執行中

605ms : 第三個定時器意圖進入隊列失敗,這個點的settimeout丟失

為了避免這2個問題,可以采用鏈式setTimeOut()進行調用

  1. setTimeOut(function(){  
  2. code處理...  
  3. setTimeOut(arguments.callee,interval);  
  4. },interval); 

這個模式鏈式條用setTimeOut(),每次函數執行的時候都會創建一個新的定時器,第二個setTimeOut調用使用了arguments.callee來獲取當前執行的函數引用,并為其設置另外一個定時器,這樣的好處在于,在前一個定時器執行完之前不會向隊列中插入新的定時器代碼,確保不會有任何的確實間隔,而且它可以保證在下一次定時器代碼執行前,至少等待指定的間隔,避免連續的運行。

秒殺的定時器已經通過檢測正式運行了,博客記錄得不好,表達不是很清楚,關于setTimeOut的函數主要參考了《JavaScript高級程序設計(第2版)》的第18章。

原文鏈接:http://www.blogjava.net/dongbule/archive/2012/01/10/368229.html

【編輯推薦】

  1. 一個Java程序員對2011年的回顧
  2. 用Java GUI編寫的畫板程序
  3. Java的動態綁定機制
  4. Java中帶復選框的樹的實現和應用
  5. Java網絡編程菜鳥進階:TCP和套接字入門
責任編輯:林師授 來源: 于吉吉的博客
相關推薦

2019-11-12 11:15:39

setTimeout前端代碼

2023-11-01 10:18:10

自動化測試工具

2021-11-08 15:38:15

消息延遲堆積

2023-03-29 10:19:44

異步編程AsyncPromise

2022-11-08 07:36:17

RocketMQ消費者消息堆積

2024-10-16 08:36:03

2011-05-16 14:54:12

測試用例

2011-06-14 14:43:03

灰盒測試

2010-05-27 11:44:37

2011-05-31 14:33:53

settimeout

2023-09-18 16:14:35

性能測試開發

2011-02-23 11:18:48

MongoDBMySQL性能測試

2010-03-05 10:31:24

Ubuntu PHP

2023-12-21 08:01:41

RocketMQ消息堆積

2011-06-14 09:12:03

JavaScript

2011-05-16 14:24:02

軟件測試

2023-05-12 07:38:46

Python基準測試性能分析

2021-11-23 09:00:59

消息堆積擴容RocketMQ

2019-05-08 08:00:49

增強分析數據科學分析技術

2021-01-13 10:51:08

PromissetTimeout(函數
點贊
收藏

51CTO技術棧公眾號

主站蜘蛛池模板: 欧美视频区 | 日韩精品在线观看网站 | 91日日| 成人亚洲精品 | 97超碰免费 | 热re99久久精品国99热观看 | 黄色一级免费观看 | 亚洲精品一区在线 | 国产精品国产三级国产aⅴ原创 | 夜夜草| 成人国产精品久久 | 成人精品一区二区三区中文字幕 | 国产精品视频免费观看 | 欧美黄色片在线观看 | 欧美一区二区在线看 | 国产日韩欧美在线 | 日韩欧美一级片 | 国产三级国产精品 | 国产精品乱码一二三区的特点 | 成人在线黄色 | 日本不卡一区 | 国产精品视频网 | 日韩在线免费视频 | 成人妇女免费播放久久久 | 天天干天天爽 | 日本人麻豆 | 区一区二在线观看 | 99亚洲综合 | 亚洲一区视频在线 | 国产98色在线 | 日韩 | 久久久免费 | 久久精品视频91 | 一级特黄在线 | 亚洲欧美第一视频 | 日韩在线一区二区三区 | 亚洲成人一级 | 亚洲视频一区二区三区 | 中文字幕精品一区二区三区精品 | 在线观看成人小视频 | 国产日韩精品久久 | 国产欧美二区 |