"!~" と "<0" どちらが速い?

0 件のコメント

文字列中に指定した文字列が含まれているかどうかを調べるのに"indexOf"を使う。 この indexOf の評価方法で、「指定した文字列が含まれない」ことを調べるのに "<0"を用いた方法ではなく、チルダ(~)を使った方法があるらしい。

"<0" を使った記述

var text = 'As flies to wanton boys are we to the gods, they kill us for their sport.';

if (text.indexOf('gods') < 0) {
    // 'gods' が含まれない場合
} else {
    // 'gods' が含まれる場合
}
"!~" を使った記述
var text = 'As flies to wanton boys are we to the gods, they kill us for their sport.';

if (!~text.indexOf('gods')) {
    // 'gods' が含まれない場合
} else {
    // 'gods' が含まれる場合
}

チルダ(~)演算子

ビット演算子。符号を逆転して1を引く。

[例] ~(-1) => (-(-1) - 1) => (0)

どちらが速いか?

指定した文字が含まれる場合(1)、指定した文字が含まれない場合(2)について、500000回ループにかかる時間を計測。5回計測した平均は次のようになりました。

[msec]
ケース IE8 IE9 Chrome23 Firefox17
!~ <0 !~ <0 !~ <0 !~ <0
(1)文字列を含む 214.6 207.2 204.8 210.4 111.4 112.2 77.2 75.4
(2)文字列を含まない 211.0 206.8 204.0 206.4 129.6 126.4 102.2 95.6

測定結果を見る限り、一概にどちらが良いとは言いにくそう。。 ということで、可読性の観点から個人的には "<0" を用いたほうが良いかと…