====== パフォーマンス ====== ===== getElementByIdは重いのか ===== // 毎回を呼び出し for(var i = 0 ; i < 100000 ; ++ i) { document.getElementById("test_01_0").style.color = "#fff" ; } // 最初のみ呼び出し1 var g = document.getElementById("test_01_1") ; for(var i = 0 ; i < 100000 ; ++ i) { g.style.color = "#fff" ; } // 最初のみ呼び出し2 var s = document.getElementById("test_01_2").style ; for(var i = 0 ; i < 100000 ; ++ i) { s.color = "#fff" ; } ^ ^ IE8 ^ Firefox3.6 ^ Chrome8 ^Safari5 ^ IOS4 ^ ^毎回呼び出し | 571ms| 245ms| 204ms| 190ms| 520ms| ^最初のみ呼び出し1| 211ms| 135ms| 185ms| 165ms| 418ms| ^最初のみ呼び出し2| 73ms| 89ms| 183ms| 159ms| 355ms| IOS4のループ回数は1/10。\\ とにかく検索を伴う呼び出し回数は減らすべき。 ===== htmlの変更は重いのか ===== // 毎回変更 var s1 = document.getElementById("test_02_0").style ; for(var i = 0 ; i < 5000 ; ++ i) { s1.color = "#f00" ; s1.top = i + "px" ; s1.left = i + "px" ; } // まとめて変更 var orgin = document.getElementById("test_02_1") ; var clone = orgin.cloneNode(false) ; var s2 = clone.style ; for(var i = 0 ; i < 5000 ; ++ i) { s2.color = "#0f0" ; s2.top = i + "px" ; s2.left = i + "px" ; } orgin.parentNode.replaceChild(clone,orgin) ; ^ ^ IE8 ^ Firefox3.6 ^ Chrome8 ^ Safari5 ^ IOS4 ^ ^毎回変更 | 247ms| 252ms| 31ms| 28ms| 697ms| ^まとめて変更| 24ms| 28ms| 31ms| 28ms| 660ms| IOSを含むSafariは内部で最適化されている。それ以外は更新をまとめて1回にしたほうが良い。 ===== lengthは重いのか ===== var table = [] ; for(var i = 0 ; i < 1000000 ; ++ i) table.push(i) ; // 毎回取得 for(var i = 0 ; i < table.length ; ++ i) { } // 最初に取得 len = table.length ; for(var i = 0 ; i < len ; ++ i) { } ^ ^ IE8 ^ Firefox3.6 ^ Chrome8 ^ Safari5 ^ IOS4 ^ ^毎回取得 | 125ms| 22ms| 2ms| 4ms| 190ms| ^最初に取得| 80ms| 24ms| 2ms| 4ms| 210ms| IOSを含むSafariは内部で最適化されている。それ以外は更新をまとめて1回にしたほうが良い。 ===== 連想配列は重いのか ===== test_04_sub0 = function(x,y,z,w,h) { return x + y + z + w + h ; } test_04_sub1 = function(param) { return param.x + param.y + param.z + param.w + param.h ; } // 普通の変数(設定) var x,y,z,w,h ; for(var i = 0 ; i < 100000 ; ++ i) { x = i ; y = i ; z = i ; w = i ; h = i ; } // 連想配列(設定) var param ; for(var i = 0 ; i < 100000 ; ++ i) { param = {"x":0,"y":1,"z":2,"w":3,"h":4} ; } // 普通の変数(参照) for(var i = 0 ; i < 100000 ; ++ i) { test_04_sub0(x,y,z,w,h) ; } // 連想配列(参照) for(var i = 0 ; i < 100000 ; ++ i) { test_04_sub1(param) ; } ^ ^ IE8 ^ Firefox3.6 ^ Chrome8 ^ Safari5 ^ IOS4 ^ ^普通の変数(設定)| 13ms| 8ms| 1ms| 1ms| 32ms| ^連想配列(設定) | 125ms| 33ms| 2ms| 8ms| 203ms| ^普通の変数(参照)| 40ms| 29ms| 1ms| 1ms| 178ms| ^連想配列(参照) | 67ms| 32ms| 2ms| 2ms| 182ms| 連想配列の設定は重いが、参照はそれほどでもない。