2
2

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?

More than 5 years have passed since last update.

String.prototype.indexOfって結構速いみたい

Last updated at Posted at 2013-08-31

こんなSuffixArray(ハッシュ使ってるけど)を作ってみた。

suffixarray.js
function SuffixArray(str) {
  var
  i, c, sa = {};
  this.str = str;

  for (i = 0; c = str.charAt(i); i++) {
    (sa[c] || (sa[c] = [])).push(i);
  }
  this.sa = sa;
}

SuffixArray.prototype.search = function (word, start) {
  if (!word) return 0;
  start = start || 0;

  var
  i,
  is = this.sa[word.charAt(0)], l = (is || []).length;

  for (i = 0; i < l; i++) {
    if (is[i] >= start && this.str.substr(is[i], word.length) === word) return is[i];
  }
  return -1;
}

SuffixArrayって言うとバイナリサーチが一般的な気がするけど、バイナリサーチよりハッシュの方が速い(し書くのが楽)に決まってるのでハッシュで書いてみた。(JavaScriptのオブジェクトをハッシュと呼んでいいのか?)

で、String.prototype.indexOfと、ついでにString.prototype.search(正規表現版indexOf)で速度を比較してみる。
jsPerfというのがあるのを知ったので、そこでやってみた。

ここにあります↓。
String.prototype.indexOf vs String.prototype.search(RegExp) vs my SuffixArray · jsPerf

結果は、

jspref1.jpg

という感じです。Opera 17って何だよ、って感じですが中身は八割ぐらいChromeなのでChromeだと思えばいいはずです。

これ、長いほど速いみたいなので、indexOfが一番速いということになります。しかもSuffixArrayより倍以上速いです。

うーん、indexOfって線形探索じゃないんだろうな…。

ちなみにFirefoxでもほぼ同じ結果でした(時間は八倍ぐらいかかりましたが)

2
2
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
2
2

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?