js.bench[1] = split || match
配列の初期値を指定する方法の処理速度検証 (Kanasansoft Web Lab.)
ループに比べて遅いのは当然としても,そもそも split はこの用途に全く向かないのだった(マッチ部分を捨てるため先読み表現を使わざるを得ず,効率が*激しく*悪い)*1。
素直に match を用いれば無駄な検索は生じない。
String.prototype.filledArrayS = function(num){ /// with split /// return (num = Number(num)) > 1 ? Array(num + 1).join(this).split(RegExp('(?=(?:[\\s\\S]{'+ this.length +'})+$)')) : [this]; }; String.prototype.filledArrayM = function(num){ /// with match /// return (num = Number(num)) > 1 ? Array(num + 1).join(this).match(RegExp('[\\s\\S]{'+ this.length +'}', 'g')) : [this]; }; confirm((function($){ var b = function(f){ for(var t = 1, d = 0, i; d < 64; d = new Date - d, t *= 8) for(d = new Date, i = t; i--;) f(); return d / (t / 8); }, c = b(function(){}), r = [], x = 0, k; for(k in $) r[x++] = k +': '+ (((b($[k])-c)*1000)|0)/1000 +' [ms/run]'; return r.join('\n\n'); })({ S: function(){ 'hoge'.filledArrayS(1000) }, M: function(){ 'hoge'.filledArrayM(1000) } }));
差は歴然。
*1:各文字境界でいちいち最後まで読みに行くわけだから速いはずが無い