1
私がここで読んで、console.time()
を使って個人的にテストしたところ、for
のループはArray.prototype.map()
よりも高速です。それはなぜですか?私はループのためのあなたのシンプルを想定していforループがArray.prototype.map()より速いのはなぜですか
私がここで読んで、console.time()
を使って個人的にテストしたところ、for
のループはArray.prototype.map()
よりも高速です。それはなぜですか?私はループのためのあなたのシンプルを想定していforループがArray.prototype.map()より速いのはなぜですか
は次のようになります。
かなりストレートフォワードと単純化したのですvar num = [];
for (var i = 0; i < 100; ++i)
num.push(i);
var result = [];
for (var i = 0; i < 100; ++i)
result.push(Math.sqrt(num[i]));
。今度は、準拠EMCA-262 implementationを見てみましょう:SpiderMonkeyの
/* ES5 15.4.4.19. */
function ArrayMap(callbackfn/*, thisArg*/) {
/* Step 1. */
var O = ToObject(this);
/* Step 2-3. */
var len = TO_UINT32(O.length);
/* Step 4. */
if (arguments.length === 0)
ThrowError(JSMSG_MISSING_FUN_ARG, 0, 'Array.prototype.map');
if (!IsCallable(callbackfn))
ThrowError(JSMSG_NOT_FUNCTION, DecompileArg(0, callbackfn));
/* Step 5. */
var T = arguments.length > 1 ? arguments[1] : void 0;
/* Step 6. */
var A = NewDenseArray(len);
/* Step 7-8. */
/* Step a (implicit), and d. */
for (var k = 0; k < len; k++) {
/* Step b */
if (k in O) {
/* Step c.i-iii. */
var mappedValue = callFunction(callbackfn, T, O[k], k, O);
// UnsafePutElements doesn't invoke setters, so we can use it here.
UnsafePutElements(A, k, mappedValue);
}
}
/* Step 9. */
return A;
}
から撮影
map
が遅くなる理由を見ることができますか?
すばらしい答えは、将来的に私は機能の実装を直接探します。 – HussienK
関数呼び出しが高価であるためです。 – undefined
コード例? jsPerf? – IMTheNachoMan
新しいスコープを初期化すると、新しいスコープが初期化されない場合よりも高価になります。 'function foo(){console.log( 'foo'); }; foo(); 'と' console.log( 'foo'); 'となります。どの人が通訳者に「仕事が少ない」ことを要求していると思いますか? –