これなのですが....
同じ文字列のn回繰り返しを作る最速の方法を探求してみた - muddy brown thangちょっとした事情により、ある文字列のn回繰り返しを作る関数 (PHPでいうところのarray_repeat(), Perlで言うところの「"..." x n」、RubyやPythonで言うところの「"..." * n」) を高速に実装しなければならない状況に遭遇したのでベンチマークをとってみたところ、その結果がとても新鮮で驚いたので、これを共有しつつもダメ出ししてもらえないかなーと思って晒してみることに。
なぜかもっとシンプルな奴がなかったので。
以下、比較。初期値はIEにあわせてあります。Firefox/Safari/Opera/Chromeでは桁を2つほど増やしてみてください。
str = n =
Naive
function (str, n){
var result = '';
for (var i = 0; i < n; i++) result += str;
return result;
};
log n
function (str, n){
var result = '';
for(n *= 1; n > 0; n >>>= 1, str += str) if (n & 1) result += str;
return result;
}
アルゴリズムは、実は
と同様です。
どのブラウザでもご利益がありますが、特にIEだと多大なご利益があります。"てってってー" x 10000 程度でも60倍近い速度差が出ました。驚異的なのがChromeで、1000000、すなわち100万回でも log n アルゴリズムは 0 msでした。
Enjoy!
Dan the Algorithmic JavaScripter
リンク先のWikipediaも見てみたんですが、バイナリ法知ってるだけではこのコードは書けないですね。
「str += str」が指数関数的に増えていくのと、数値の2進数表現をこんな風に応用するとは・・・感服いたしました。