パフォーマンス

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

連想配列の設定は重いが、参照はそれほどでもない。

lang/javascript/パフォーマンス.txt · 最終更新: 2018/03/18 09:56 (外部編集)
 
特に明示されていない限り、本Wikiの内容は次のライセンスに従います: CC Attribution-Share Alike 4.0 International
Recent changes RSS feed Donate Powered by PHP Valid XHTML 1.0 Valid CSS Driven by DokuWiki