jQuery処理時間高速化のポイント

DOM操作の回数を減らす

appendメソッドを500回実行して作る場合

実行
10回の平均処理: msec
for(var h=0;h<500;h++){
	$('#domTa').append('
'); }

500個のdivを変数に入れてappendメソッドを1回実行して作る場合

実行
10回の平均処理: msec
var html = '';
for(var h=0;h<500;h++){
	html += '
'; } $('#domTa').append(html);

単一要素の参照はIDを使う

属性値で参照した場合(500回)

実行
10回の平均処理: msec

for(var h=0;h<500;h++){
	$('[value="input"]');
}

クラスで参照した場合(500回)

実行
10回の平均処理: msec

for(var h=0;h<500;h++){
	$('.input');
}

タグで参照した場合(500回)

実行
10回の平均処理: msec

for(var h=0;h<500;h++){
	$('input');
}

IDで参照した場合(500回)

実行
10回の平均処理: msec

for(var h=0;h<500;h++){
	$('#input');
}

階層を掘り下げる参照はfindを使う

子孫セレクタで参照した場合(500回)

実行
10回の平均処理: msec

for(var h=0;h<500;h++){
	$('#content .news p');
}

子セレクタで参照した場合(500回)

実行
10回の平均処理: msec

for(var h=0;h<500;h++){
	$('#content > .news > p');
}

findメソッドで参照した場合(500回)

実行
10回の平均処理: msec

for(var h=0;h<500;h++){
	$('#content').find('.news').find('p');
}

要素を参照する際に範囲を指定する

FirefoxやInternet Explorerでは実感できるほどの差は出ませんが、ChromeやSafariでは明らかです。

範囲を指定していない場合

実行
10回の平均処理: msec
for(var h=0;h<500;h++){
	$('.canvas');
}

範囲を指定した場合

実行
10回の平均処理: msec
for(var h=0;h<500;h++){
	$('.canvas', '#select');
}

何度も参照するものはキャッシュする

キャッシュを使わない場合(500回)

実行
10回の平均処理: msec

for(var h=0;h<500;h++){
	$('#main').find('.news').find('p');
	$('#main').find('.column').find('p');
}

キャッシュを使った場合(500回)

実行
10回の平均処理: msec

var main = $('#main');
for(var h=0;h<500;h++){
	main.find('.news').find('p');
	main.find('.column').find('p');
}

メソッドチェーンを使う

メソッドチェーンを使わない場合(500回)

実行
10回の平均処理: msec
for(var h=0;h<500;h++){
	$('#methodChainTa .target').css('margin-left', i*h);
	$('#methodChainTa .target').attr('width', i*h);
}

メソッドチェーンを使った場合(500回)

実行
10回の平均処理: msec
for(var h=0;h<500;h++){
	$('#methodChainTa .target').css('margin-left', i*h)
								.attr('width', i*h);
}

eachよりforを使う

eachを使った場合

実行
10回の平均処理: msec
array = [1, 2, 3, 4, 5];
$.each(array, function(h){
	array[h];
});

forを使った場合

実行
10回の平均処理: msec
array = [1, 2, 3, 4, 5];
for(var h=0; h<array.length;h++){
	array[h];
}