高速化の効果が特に高かったコーディング方法をメモしておきます。
※今回使用したブラウザ
Chromium バージョン 32.0.1700.107 Ubuntu 13.10
セレクタでDOMを取得するとき
IDを指定する
できるだけIDを指定します。
例: $("#div1")
セレクタはシンプルに
できるだけセレクタはシンプルにします。
遅い: $(".class1 .class2 .class3")
速い: $(".class3") 約4倍高速
メソッドを使う
遅い: $("div:eq(0)")
速い: $("div").eq(0) 約20倍高速
スタイルを指定するとき
css()をメソッドチェーンで使う
遅い:
elem.css("color", "black");
elem.css("background-color", "white");普通:
elem.addClass("myclass");約3倍高速速い:
elem
.css("color", "black")
.css("background-color", "white");約10倍高速属性を指定するとき
attr()をメソッドチェーンで使う
遅い:
elem.attr({
"alt": "hoge",
"title": "foo"
});普通:
elem.attr("alt", "hoge");
elem.attr("title", "foo");約10倍高速速い:
elem
.attr("alt", "hoge")
.attr("title", "foo");約20倍高速data属性を指定するとき
$.data()を使う
遅い:
elem.data("key", "value")速い:$.data(elem, "key", "value")約2倍高速
ループ処理
$.each よりも JSネイティブな for を使う
[JavaScript]最速の配列ループ処理
実験に使ったコード
<meta charset="utf-8"></meta>
<style type="text/css">
.myclass {
color: black;
background-color: white;
border:1px solid black;
}
</style>
<!--script src="lib/js/jquery-2.1.0.min.js"></script-->
<script src="https://code.jquery.com/jquery-2.1.0.min.js"></script>
<script type="text/javascript">
$(function() {
/* ===================================
* get element by selector
* ==================================*/
var elem = null;
console.log("-- Get element by selector --");
// by specified id
console.time("$('#divI')");
elem = $("#divI");
console.timeEnd("$('#divI')");
// by detailed classname
console.time('$(".class0 .class1 .class2 .class3")[2]');
elem = $(".class0 .class1 .class2 .class3")[2];
console.timeEnd('$(".class0 .class1 .class2 .class3")[2]');
// by simple classname
console.time('$(".class3")[8]');
elem = $(".class3")[8];
console.timeEnd('$(".class3")[8]');
// by method
console.time('$(".class3").eq(8)');
elem = $(".class3").eq(8);
console.timeEnd('$(".class3").eq(8)');
// by complex selector
console.time('$(".class3:eq(8)")');
elem = $(".class3:eq(8)");
console.timeEnd('$(".class3:eq(8)")');
/* ===================================
* apply styles
* ==================================*/
console.log("-- styles --");
console.time("addClass('myclass')");
elem.addClass('myclass');
console.timeEnd("addClass('myclass')");
console.time("css() separately");
elem.css("color", "black");
elem.css("background-color", "white");
elem.css("border", "1px solid black");
console.timeEnd("css() separately");
console.time("css({...})");
elem.css({
"color": "black",
"background-color": "white",
"border": "1px solid black"
});
console.timeEnd("css({...})");
console.time("css().css()...");
elem
.css("color", "black")
.css("background-color", "white")
.css("border", "1px solid black");
console.timeEnd("css().css()...");
/* ===================================
* use data attribute
* ==================================*/
console.log("-- data attribute --");
console.time("$.data()");
$.data(elem, "key1", "value1");
console.timeEnd("$.data()");
console.time("elem.data()");
elem.data("key1", "value1");
console.timeEnd("elem.data()");
/* ===================================
* use attribute
* ==================================*/
console.log("-- attribute --");
console.time("attr({...})");
$("#img0").attr({
'title': 'http://mysite.com/images/image.jpg',
'alt': 'My Image'
});
console.timeEnd("attr({...})");
console.time("attr() separately");
$("#img0").attr('title', 'http://mysite.com/images/image.jpg');
$("#img0").attr('alt', 'My Image');
console.timeEnd("attr() separately");
console.time("attr().attr()...");
$("#img0")
.attr('title', 'http://mysite.com/images/image.jpg')
.attr('alt', 'My Image');
console.timeEnd("attr().attr()...");
});
</script>
<img id="img0"></img>
<div class="class0">
<div class="class1">
<div class="class2">
<div id="divA" class="class3">A</div>
<div id="divB" class="class3">B</div>
<div id="divC" class="class3">C</div>
</div>
</div>
<div class="class1">
<div class="class2">
<div id="divD" class="class3">D</div>
<div id="divE" class="class3">E</div>
<div id="divF" class="class3">F</div>
</div>
</div>
<div class="class1">
<div class="class2">
<div id="divG" class="class3">G</div>
<div id="divH" class="class3">H</div>
<div id="divI" class="class3">I</div>
</div>
</div>
</div>実行結果
-- Get element by selector --
$('#divI'): 0.158ms
$(".class0 .class1 .class2 .class3")[2]: 0.621ms
$(".class3")[8]: 0.157ms
$(".class3").eq(8): 0.156ms
$(".class3:eq(8)"): 2.960ms
-- styles --
addClass('myclass'): 0.297ms
css() separately: 0.933ms
css({...}): 0.167ms
css().css()...: 0.099ms
-- data attribute --
$.data(): 0.458ms
elem.data(): 0.758ms
-- attribute --
attr({...}): 0.723ms
attr() separately: 0.052ms
attr().attr()...: 0.030ms
まとめ
できるだけメソッドチェーンを使うべし。メンテナンス性を考えると、スタイルの操作に addClass() / removeClass() を使うのも悪くないと思いますが、処理スピードを重視する場面ではメソッドチェーンを使うのがベスト。
0 件のコメント:
コメントを投稿