亚洲香蕉成人av网站在线观看_欧美精品成人91久久久久久久_久久久久久久久久久亚洲_热久久视久久精品18亚洲精品_国产精自产拍久久久久久_亚洲色图国产精品_91精品国产网站_中文字幕欧美日韩精品_国产精品久久久久久亚洲调教_国产精品久久一区_性夜试看影院91社区_97在线观看视频国产_68精品久久久久久欧美_欧美精品在线观看_国产精品一区二区久久精品_欧美老女人bb

首頁 > 編程 > JavaScript > 正文

深入探究JavaScript中for循環的效率問題及相關優化

2019-11-20 10:23:42
字體:
來源:轉載
供稿:網友

Underscore.js庫

你一天(一周)內寫了多少個循環了?

var i;for(i = 0; i < someArray.length; i++) { var someThing = someArray[i]; doSomeWorkOn(someThing);}

這當然無害,但這種寫法非常丑而且奇怪,這也不是真正需要抱怨的。但這種寫法太平庸了。

var i, j;for(i = 0; i < someArray.length; i++) { var someThing = someArray[i]; for(j = 0; j < someThing.stuff.length; j++) {   doSomeWorkOn(someThing.stuff[j]); }}

你在擴展糟糕的代碼,在你拋出一大堆if前,你已經精神錯亂了。
我在兩年里沒有寫一個循環(loop)。
“你在說什么?”
這是真的,一個冷笑話。其實不是一個都沒有(好吧,我確實寫了幾個),因為我不寫循環(loops),我的代碼更容易理解。
怎么做的呢?

_.each(someArray, function(someThing) { doSomeWorkOn(someThing);})

或者更好一點:

_.each(someArray, doSomeWorkOn);

這就是underscorejs所做到的。干凈,簡單,易讀,短,沒有中間變量,沒有成堆的分號,簡單非常優雅。
這是另外一些例子。

var i, result = [];for(i = 0; i < someArray.length; i++) { var someThing = someArray[i]; // 打到這,我已經手疼了 if(someThing.isAwesome === true) {   result.push(someArray[i]); }}

同樣,一個使用循環浪費時間的典型用例。即便這些網站是宣傳禁煙和素食主義的,看到這些代碼我也感到義憤??纯春唵蔚膶懛?。

var result = _.filter(someArray, function(someThing) { return someThing.isAwesome === true;})

像underscore中的filter(過濾)的名字那樣,隨手寫的3行代碼就可以給你一個新的數組(array)。
或者你想把這些數組轉換成另外一種形式?

var result = _.map(someArray, function(someThing) { return trasformTheThing(someThing);})

上面三個例子在日常生活中已經夠用了,但這些功能還不足矣讓underscore放到臺面上。

var grandTotal = 0, somePercentage = 1.07, severalNumbers = [33, 54, 42], i; // don't forget to hoist those indices;for(i = 0; i < severalNumbers.length; i++) { var aNumber = severalNumbers[i]; grandTotal += aNumber * somePercentage;}

underscore版本

var somePercentage = 1.07, severalNumbers = [33, 54, 42], grandTotal;grandTotal = _.reduce(severalNumbers, function(runningTotal, aNumber) { return runningTotal + (aNumber * somePercentage);}, 0)

這個剛開始看上去可能有點怪,我查了下關于reduce的文檔,知道了它的存在。因為我拒絕使用循環,所以它是我的首選。上面這些東西僅僅是入門,underscorejs庫還有一大堆牛B的功能。

30天不使用循環的挑戰。

在一下一個30天里,不要使用任何循環,如果你看到一堆討厭和粗糙的東西,用each或者map將他們替換掉。再用一點reducing。

你需要注意到,Underscore是通往函數式編程的。一種看得見,看不見的方式。一條很好的途徑。


OurJS注*目前現代瀏覽器已經支持each, filter, map, reduce方法,但underscore庫可以實現對舊版IE的兼容,下面是使用ES5原生方法寫的例子:

[3,4,5,3,3].forEach(function(obj){  console.log(obj);});[1,2,3,4,5].filter(function(obj){  return obj < 3});[9,8,5,2,3,4,5].map(function(obj){  return obj + 2;});[1,2,3,4,5].reduce(function(pre, cur, idx, arr) {  console.log(idx);  //4 個循環: 2-5  return pre + cur;});  //15//sort方法同樣很有用[9,8,5,2,3,4,5].sort(function(obj1, obj2){  return obj1 - obj2;});

for in與for loop

有人提出for in的效率要比for loop(循環)的效率低非常多?,F在我們測試一下在不同瀏覽器中使用for in, for loop和forEach在處理大數組時的效率究竟如何。

目前絕大部分開源軟件都會在for loop中緩存數組長度,因為普通觀點認為某些瀏覽器Array.length每次都會重新計算數組長度,因此通常用臨時變量來事先存儲數組長度,如:

for (var idx = 0, len = testArray.length; idx < len; idx++) { //do sth.}

我們也會測試一下緩存與不緩存時的性能差異。

同時在每個測試循環中添加求和運算,來表明其不是空循環。

for (var idx = 0, len = testArray.length; idx < len; idx++) { //do sth.}

我們也會測試一下緩存與不緩存時的性能差異。

同時在每個測試循環中添加求和運算,來表明其不是空循環。

測試代碼如下,點擊運行即可查看
HTML 代碼

<h4 id="browser"></h4><table id="results" class="table"></table>

JavaScript 代碼

function () { //準備測試數據, 有200萬條數據的大數組 var testArray = []  , testObject = {}  , idx  , len = 2000000  , tmp = 0  , $results = $("#results")  , $browser = $("#browser")  ; $browser.html(navigator.userAgent); $results.html(''); for (var i = 0; i < len; i++) {  var number = Math.random(); //若希望加快運算速度可使用取整:Math.random() * 10 | 0  testArray.push(number);  testObject[i] = number; } $results.append('<tr><th>測試代碼</th><th>計算結果</th><th>所需時間,毫秒</th></tr>'); //測試函數 var test = function(testFunc) {  var startTime   , endTime   , result   ;  startTime = new Date();  tmp = 0;  testFunc();  endTime  = new Date();  //計算測試用例(Test Case)運行所需要的時間  result = endTime - startTime;  $results.append('<tr><td><pre>{0}</pre></td><td>{1}</td><td>{2}</td></tr>'.format(testFunc.toString(), tmp | 0, result)); }; test(function() {  //測試for in 的效率  for (idx in testArray) {   tmp += testArray[idx]; //經測試,idx是string類型,可能是慢的原因之一  } }); test(function() {  //測試for loop循環的效率  for (idx = 0, len = testArray.length; idx < len; idx++) {   tmp += testArray[idx];  } }); test(function() {  //測試forEach的效率  testArray.forEach(function(data) {   tmp += data;  }); }); test(function() {  //測試不緩存Array.length時效率  for (idx = 0; idx < testArray.length; idx++) {   tmp += testArray[idx];  } }); test(function() {  //測試使用{} (Object) 存健值對時,使用for in的效率如何  for (idx in testObject) {   tmp += testObject[idx];  } });  test(function() {  //測試從{} Object查值時的效率如何(這里的健key值事先己知)  for (idx = 0, len = testArray.length; idx < len; idx++) {   tmp += testObject[idx];  } });}

運行 [需稍等片刻]
測試結果
測試結果可能因計算而異,這是在我機器上運行用,Firefox, Chrome, IE三者測試結果拼接的一張匯總。

2016313110044207.jpg (971×678)

以下是幾個觀察到的結論

  • for in比for loop慢非常多,在Chrome中至少慢20倍
  • FF對forEach(ES5)做了優化,性能比for loop還要好一點,但Chrome/IEn性能均較差
  • FF/Chrome緩存Array.length均比直接用時要慢一點。除IE最新版緩存后性能提升微乎其微(這一點非常意外)
  • 在某些情況下,FF的JS引擎性能似乎比V8要好些
發表評論 共有條評論
用戶名: 密碼:
驗證碼: 匿名發表
亚洲香蕉成人av网站在线观看_欧美精品成人91久久久久久久_久久久久久久久久久亚洲_热久久视久久精品18亚洲精品_国产精自产拍久久久久久_亚洲色图国产精品_91精品国产网站_中文字幕欧美日韩精品_国产精品久久久久久亚洲调教_国产精品久久一区_性夜试看影院91社区_97在线观看视频国产_68精品久久久久久欧美_欧美精品在线观看_国产精品一区二区久久精品_欧美老女人bb
久久亚洲一区二区三区四区五区高| 日韩av在线免费| 亚洲国产欧美一区二区三区久久| 日韩精品丝袜在线| 国产精品视频自拍| 亚洲色图综合网| 欧美黄色小视频| 久久免费精品视频| 国产亚洲精品91在线| 国产精品扒开腿做爽爽爽视频| 国产精品久久久久久久午夜| 91久久久久久久久久| 欧美激情视频播放| 国产亚洲综合久久| 亚洲毛片在线观看| 7m精品福利视频导航| 国产主播精品在线| 国产精品吊钟奶在线| 日韩av网站导航| 少妇高潮久久久久久潘金莲| 久久久久久久影视| 国产97色在线|日韩| 亚洲性生活视频在线观看| 69久久夜色精品国产7777| 日韩欧美在线视频观看| 欧美精品成人在线| 91网站免费看| 日韩免费电影在线观看| 亚洲一区二区久久久久久| 78m国产成人精品视频| 国产深夜精品福利| 日韩精品在线电影| 欧美性xxxxx极品| 久久久在线免费观看| 尤物99国产成人精品视频| 欧美激情视频一区二区三区不卡| 亚洲a级在线播放观看| 亚洲第一视频在线观看| 欧美麻豆久久久久久中文| 久久在线视频在线| 欧美成人精品在线观看| 久久精彩免费视频| 日韩国产在线看| 欧美性xxxxx极品娇小| 欧美一级视频一区二区| 美女av一区二区三区| 久久精品亚洲国产| 成人性生交xxxxx网站| 日本中文字幕不卡免费| 久久综合色影院| 青青青国产精品一区二区| 欧美激情精品久久久久久久变态| 成人激情在线播放| 91伊人影院在线播放| www.久久久久久.com| 91视频-88av| 最新日韩中文字幕| 日韩高清电影免费观看完整| 日韩成人网免费视频| 麻豆一区二区在线观看| 精品少妇一区二区30p| 中文字幕日韩欧美在线视频| 欧美疯狂性受xxxxx另类| 国产精品免费久久久久影院| 九九九久久久久久| 欧美激情日韩图片| 国产日韩精品视频| 欧美国产日韩精品| 一本一本久久a久久精品综合小说| 欧美国产视频一区二区| 亚洲精品久久久一区二区三区| 亚洲精品国产精品乱码不99按摩| 日本高清不卡的在线| 综合国产在线视频| 日韩中文字幕网| 日韩av片电影专区| 欧美日韩精品二区| 亚洲精品美女在线观看| 精品久久久国产精品999| 美日韩丰满少妇在线观看| 欧美激情中文字幕乱码免费| 久久免费视频网站| 久国内精品在线| www.久久草.com| 成人亚洲综合色就1024| 国内精品久久久| 亚洲欧美视频在线| 国产一区二区三区在线视频| 伊人男人综合视频网| 97精品视频在线观看| 亚洲欧美另类人妖| 久久久久国产精品一区| 精品国产欧美一区二区三区成人| 国产精品日韩在线| 欧美日韩亚洲高清| 欧美大尺度电影在线观看| 色樱桃影院亚洲精品影院| 日韩欧美极品在线观看| 精品国产欧美一区二区五十路| 色婷婷综合久久久久| 亚洲成人性视频| 色综合久久天天综线观看| 亚洲国产成人久久综合| 日韩欧美国产激情| 亚洲精品国产精品乱码不99按摩| 久久久久久久国产精品| 日韩美女免费观看| 91精品国产777在线观看| 日本精品久久久久影院| 国产精品久久久久久久久久99| 日本午夜精品理论片a级appf发布| 日韩欧美主播在线| 亚洲自拍偷拍视频| 久久免费视频观看| 亚洲国产欧美日韩精品| 亚洲天堂影视av| 国产免费观看久久黄| 亚洲国产精品久久精品怡红院| 国产精品一区二区久久精品| 国产精品久久久久久婷婷天堂| 美女视频久久黄| 欧美高清在线视频观看不卡| 亚洲人av在线影院| 亚洲成人黄色在线观看| 福利视频导航一区| 亚州国产精品久久久| 欧美激情第三页| 色噜噜亚洲精品中文字幕| 精品视频—区二区三区免费| 久久久这里只有精品视频| 蜜臀久久99精品久久久久久宅男| 成人免费xxxxx在线观看| 欧美俄罗斯乱妇| 欧美插天视频在线播放| 欧美性视频精品| 国产成人午夜视频网址| 国产一区二区黄| 操人视频在线观看欧美| 欧美性xxxxxxxxx| 国产高清在线不卡| 亚洲欧美日韩天堂一区二区| 国产91色在线|免| 亚洲人成77777在线观看网| 欧美激情一区二区三级高清视频| 国产日韩精品在线播放| …久久精品99久久香蕉国产| 国产精品露脸av在线| 久久91精品国产91久久跳| 欧美日韩另类字幕中文| 亚洲精品国精品久久99热| 欧美巨乳在线观看| 国产激情久久久久| 日本精品久久电影| 国产精品三级在线| 欧美成人午夜影院| 日韩精品免费综合视频在线播放| 亚洲精品国产福利| 亚洲人成在线观看网站高清| 97精品国产97久久久久久| 欧美一区二区三区精品电影| 欧美交受高潮1| 美女国内精品自产拍在线播放| 成人免费在线视频网站| 国产精国产精品|