それで、私はMDNの免責事項と警告を読みました、私は主題に関する素晴らしい答えを読みました、しかし私が知りたいことがまだあります。この質問は、実際に、私は別の質問に答えたから来たここに。
私が汚い行為をすることに決めたとしましょう。一生後悔すること。永遠に恥ずかしさで私を汚し、私の姓を不名誉にする何か。-の意図的で意図的な結末
了解しました。それで十分です。とにかく、ここにあります:
let proto = Object.getPrototypeOf(Function.prototype);
Object.setPrototypeOf(Function.prototype, {
iBetterHaveAGoodReasonForDoingThis : "Bacon!"
});
//just to prove it actually worked
let f = (function(){});
console.log(f.iBetterHaveAGoodReasonForDoingThis);
// Quick, hide the evidence!!
Object.setPrototypeOf(Function.prototype, proto);
基本的に、私がそこで行ったことは、のプロトタイプを変更するFunction.prototype
ことでした。これは、作成できるJavaScriptコードのほぼすべての部分に影響を与えるオブジェクトです。それから私はそれを元に戻しました。
多くのコードに影響を与え、多くの最適化が無駄になるプロトタイプチェーンの大きな変更を説明したかったのです。元に戻すと何かが修正されるとは思いません(どちらかといえば、パフォーマンスが悪化すると思います)。そうなるかどうか知りたいのですが、もしそうなら、それは私の意図ではありませんでした。
このような変更を行った後、JavaScript環境が回復し始め、最適化が再開されるかどうかを知りたいだけです。それとも、それは永遠に諦め、すべてを最適化されていないモードで実行しますか?このために決して達成されない最適化はありますか?最終的には回復期間を経て、通常の状態に戻ると信じられますか?
文脈上、私はV8の最新バージョンのようなエンジンについて話しているのであって、InternetExplorerのようなものによって使用される原始的ながらくたではありません。システムによって答えが異なる可能性があることは理解していますが、それらの間にいくつかの共通点があることを願っています。
V8開発者はこちら。この質問には簡単な答えはありません。
ほとんどの最適化は「戻ってきます」(もちろん、追加のCPU時間を費やすことを犠牲にして)。たとえば、破棄する必要があった最適化されたコードは、最終的に再コンパイルされます。
一部の最適化は永久に無効のままになります。たとえば、V8は、プロトタイプチェーンがいじられていないことを知っている場合(およびその限り)、特定のチェックをスキップします。アプリがプロトタイプチェーンを変更するのを見ると、それ以降は安全に再生されます。
物事をさらに複雑にするために、詳細は時間とともに変化する可能性があります。(これが、ここでより具体的な状況をリストすることにあまり意味がない理由です。申し訳ありません。)
バックグラウンド:
JavaScriptには、JavaScriptエンジンがチェックしなければならない特定のことをコードが実行する可能性のある場所がたくさんありますが、ほとんどのコードはそれを実行しません。(たとえば、配列のプロトタイプから欠落している要素を継承し['a', ,'c'][1]
ます。誰かがまたはを実行した場合を除いてundefined
、ほとんどの場合、を返します。)したがって、関数の最適化されたコードを生成するとき、エンジンは2つのオプションのどちらかを決定する必要があります。Array.prototype[1] = 'b'
Object.prototype[1] = 'b'
(A)常に問題のあるものをチェックします(例:配列のプロトタイプチェーンを歩き、すべてのプロトタイプをチェックして、そのインデックスに要素があるかどうかを確認します)。このコードの実行に2時間単位かかるとしましょう。
(B)配列のプロトタイプには要素がないと楽観的に想定し、チェックをスキップします(例では、プロトタイプを見ないで、返すだけですundefined
)。これにより、実行時間が1時間単位に短縮されたとしましょう(2倍の速さですよね!)。ただし、正しくするためには、エンジンはすべての配列のプロトタイプチェーンを注意深く監視する必要があり、要素がどこかに表示された場合は、この仮定に基づくすべてのコードを見つけて破棄する必要があります。コストは1000です。時間単位。
このトレードオフを考えると、エンジンは最初は高速だが危険な戦略(B)に従うのは理にかなっていますが、それが1回でも失敗すると、より安全な戦略(A)に切り替えて、リスクを回避します。 1000時間単位のペナルティを再度支払う。
「一度でも」が最良のしきい値であるかどうか、またはサイトが(B)をあきらめる前に、2、3、またはそれ以上のフリーパスを取得する必要があるかどうかを議論できますが、基本的なトレードオフは変わりません。
この記事はインターネットから収集されたものであり、転載の際にはソースを示してください。
侵害の場合は、連絡してください[email protected]
コメントを追加