ホームページ  >  記事  >  ウェブフロントエンド  >  __proto__ を変更すると JavaScript のパフォーマンスが低下するのはなぜですか?

__proto__ を変更すると JavaScript のパフォーマンスが低下するのはなぜですか?

Patricia Arquette
Patricia Arquetteオリジナル
2024-11-02 10:14:30608ブラウズ

Why Does Mutating __proto__ Result in Performance Degradation in JavaScript?

__proto__ の変更: パフォーマンスが低下する理由

JavaScript の proto プロパティのドキュメントでは、[[パフォーマンスに悪影響を与えるため、オブジェクトのプロトタイプ]]。これは、Function.prototype にプロパティを追加するのとは対照的に、オブジェクトのプロトタイプを変更することは、最新の JavaScript 実装に重大な影響を与えるためです。

次の例を考えてみましょう。

<code class="javascript">function Foo(){}
function bar(){}

var foo = new Foo();

// This is bad: 
//foo.__proto__.bar = bar;

// But this is okay
Foo.prototype.bar = bar;

// Both cause this to be true: 
console.log(foo.__proto__.bar == bar); // true</code>

どちらのアプローチでも結果は得られます。 foo.__proto__.bar が bar に設定されている場合、パフォーマンスへの影響は大きく異なります。 Foo.prototype.bar の再割り当ては許容されますが、foo.__proto__.bar を直接変更することは強くお勧めできません。

このパフォーマンスの低下を理解する鍵は、JavaScript エンジンによって採用される内部最適化にあります。オブジェクトのプロパティにアクセスすると、エンジンは型と構造の推論に基づいて最適化を採用します。ただし、[[Prototype]] の変更はこれらの最適化を無効にし、エンジンが最適化されていない低速のコード パスにフォールバックすることを強制します。

このパフォーマンスの低下は、オブジェクトのプロトタイプを変更すると、本質的にその内部型が交換されるため発生します。プリコンパイルされたコードを中断し、プロパティ検索の最適化をフラッシュします。その結果、最新の JavaScript 実装での後続の実行は不可避的に遅くなります。

さらに、このようなプロトタイプの変更は型混乱の危険にもつながり、スクリプトの動作に関する推論がより難しくなり、VM とJIT実装。結果として、既存のプロトタイプを変更する代わりに、Object.create() を介して異なるプロトタイプ チェーンを持つ新しいオブジェクトを作成することをお勧めします。

以上が__proto__ を変更すると JavaScript のパフォーマンスが低下するのはなぜですか?の詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。

声明:
この記事の内容はネチズンが自主的に寄稿したものであり、著作権は原著者に帰属します。このサイトは、それに相当する法的責任を負いません。盗作または侵害の疑いのあるコンテンツを見つけた場合は、admin@php.cn までご連絡ください。