2016-05-20 20 views
1

私がここで読んで、console.time()を使って個人的にテストしたところ、forのループはArray.prototype.map()よりも高速です。それはなぜですか?私はループのためのあなたのシンプルを想定していforループがArray.prototype.map()より速いのはなぜですか

+5

関数呼び出しが高価であるためです。 – undefined

+2

コード例? jsPerf? – IMTheNachoMan

+4

新しいスコープを初期化すると、新しいスコープが初期化されない場合よりも高価になります。 'function foo(){console.log( 'foo'); }; foo(); 'と' console.log( 'foo'); 'となります。どの人が通訳者に「仕事が少ない」ことを要求していると思いますか? –

答えて

1

は次のようになります。

かなりストレートフォワードと単純化したのです
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が遅くなる理由を見ることができますか?

+0

すばらしい答えは、将来的に私は機能の実装を直接探します。 – HussienK

関連する問題