====== パフォーマンス ======
===== 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|
連想配列の設定は重いが、参照はそれほどでもない。