ほとんどの JavaScript ネイティブ関数がネイティブ実装よりも遅いのはなぜですか? 質問する

ほとんどの JavaScript ネイティブ関数がネイティブ実装よりも遅いのはなぜですか? 質問する

私は気づいたいくつかの テストネイティブ JavaScript 関数は、単純な実装よりもはるかに遅くなることがよくあります。その理由は何でしょうか?

ベストアンサー1

見てからECMA-262ネイティブ実装はもっとやる単純な自己実装よりも、エラー処理と機能の点で優れています。

たとえば、mapMDN のポリフィル実装を確認してください。配列.プロトタイプ.マップ()これは、ECMA-262 で指定されているものと同じアルゴリズムに基づいています。このアルゴリズムを使用するように例を更新すると、ネイティブ実装がわずかに高速化されます。マップネイティブと実装

また、mapネイティブ コードと提供されたラムダ関数の間を行ったり来たりするため、テストに最適な例ではない可能性があります。

ネイティブ関数の方がパフォーマンスが良いと期待していましたconcat。しかし、ECMA-262を見ると、もっとやるセクション 15.4.4.4 のアルゴリズムを見ると、いくつかの追加のケースが処理されていることがわかります。たとえば、配列と他の型の複数の引数を組み合わせる場合などです。

[1, 2, 3].concat([4, 5, 6], "seven", 8, [9, 10]);

戻り値

[1, 2, 3, 4, 5, 6, "seven", 8, 9, 10]

最後に、これらは非常に基本的なアルゴリズムであることに注意してください。このようなアルゴリズムを巨大なデータ セットで実行したり、何千回も連続して実行したりすると、一方が他方よりも大幅に高速であるように見える場合があります。ただし、数千回の反復で 2、3 の追加の安全性チェックを実行するだけでも、チェックを行わないアルゴリズムよりも大幅に遅くなる可能性があります。計算操作を数えてください。追加のエラー処理と機能によってループ内のコード行数が 2 倍になると、遅くなるのは当然です。

おすすめ記事