2010/01/25
JavaScript的startsWith 続き
http://dev.ariel-networks.com/Members/uchida/javascript7684startswith/
がendsWithを調べたところ、どうもそれだけではないようです。
文字列が短いときはindexOf版に及びませんが、私はこれを単に、lastIndexOf版はindexOf版より引数が増えたため範囲チェック等の処理が増えたんだろうと思っていました。
がendsWithを調べたところ、どうもそれだけではないようです。
goog.string.endsWith = function(str, suffix) {closureのendsWithはご覧のとおりlastIndexOfを読んでいます。
var l = str.length - suffix.length;
return l >= 0 && str.lastIndexOf(suffix, l) == l;
};
startsWithでは逆にこれをindexOfに書き換えれば無駄な探索がなくなる、しかも引数の数が同じなので見つけた場合の速度も変わらないはず。
で、これが結果です。
fujitaさんにJSLitmus.jsというツールを教えてもらったのでそれを使ってます。数字が大きいほど速い処理になります。
lastIndexOf | indexOf | |
---|---|---|
abcdefghi endsWith hi | 16205537 | 8256192 |
abcdefghi endsWith h* | 10876803 | 7332453 |
abcdefghijklmnopqrstyuwx endsWith wx | 13090052 | 7744009 |
abcdefghijklmnopqrstyuwx endsWith w* | 6586334 | 7931452 |
abcdefghijklmnopqrstyuwxyzABCDEFGHIJKLM endsWith LM | 14726198 | 6611250 |
abcdefghijklmnopqrstyuwxyzABCDEFGHIJKLM endsWith L* | 5185713 | 7813253 |
前回はあまりに極端なパターンだったのでstartsWithの方も測り直しています。
startswith-endswith-benchmark-20100123.zip
startswith-endswith-benchmark-results-20100123.zip
文字数が少ない場合にindexOf版endsWithが遅くなるのは予想外でした。
分岐予測の失敗でもしているのでしょうか?
アルゴリズムから見ればlastIndexOf版startsWithやindexOf版endsWithの方が速くなりそうに見えるんですが。
なんか納得いかないなあ。
- Category(s)
- JavaScript
- The URL to Trackback this entry is:
- http://dev.ariel-networks.com/Members/uchida/javascript7684startswith-7d9a304d/tbping