オブジェクトの[[Prototype]]を変更した後、JavaScript環境は最終的に回復しますか?

グレッグロス

それで、私は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のようなものによって使用される原始的ながらくたではありません。システムによって答えが異なる可能性があることは理解していますが、それらの間にいくつかの共通点があることを願っています。

jmrk

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]

編集
0

コメントを追加

0

関連記事

分類Dev

環境rのオブジェクトの名前を変更します

分類Dev

Javaの「最終」キーワードはどのように機能しますか?(私はまだオブジェクトを変更できます。)

分類Dev

環境オブジェクトを変更し、SwiftUIで別のオブジェクトからデータをクリアします

分類Dev

環境変数を変更した後、フィクスチャにオブジェクトを正しくインポートする方法

分類Dev

Postman:JSONオブジェクトを環境変数に保存して、別のリクエストにチェーンすることはできますか?

分類Dev

関数を使用してPython環境からすべての変数/オブジェクトを削除します

分類Dev

Postman の環境変数を介して JavaScript オブジェクトにアクセスできません

分類Dev

オブジェクトの値を最後のJavaScriptにカットします

分類Dev

Pythonは、スクリプトの最後に環境変数を自動的に設定解除しますか?

分類Dev

Javascriptは、ループの最後の1つだけをJSONオブジェクトに保存しました

分類Dev

javascriptは、promiseオブジェクトが内部にあるforループの最後の反復のみの出力を示します

分類Dev

javascript オブジェクト全体を反復処理し、type のすべての値を変更します

分類Dev

JavaScriptまたはjQueryを使用して配列内にあるオブジェクトの値を変更するにはどうすればよいですか?

分類Dev

最後から2番目のオブジェクトまで、マップを使用してオブジェクトの配列を反復処理します

分類Dev

リポジトリインターフェイスは、forループ内にある場合に最後のオブジェクトインスタンスのみを保存し、一括挿入は保存前にオブジェクトを変更します

分類Dev

ブラウザ環境からPuppeteerのノード環境にオブジェクトをどのように返しますか?

分類Dev

配列オブジェクトの中央/最初に挿入した後、配列オブジェクトのキーを変更します

分類Dev

配列オブジェクトの中央/最初に挿入した後、配列オブジェクトのキーを変更します

分類Dev

内部的には、JavaScriptはオブジェクトキーをどのように反復しますか?

分類Dev

最後の要素の前のオブジェクトを取得したい。しかし、nullを返します

分類Dev

JavaFXはキャンバスから最後に描画されたオブジェクトを削除します

分類Dev

forEach、[]。forEach.call(...)またはArray.prototype.slice.call(...)。forEachを使用して配列のようなオブジェクトを反復しますか?

分類Dev

特定のパターンに一致するオブジェクトを除くすべてのオブジェクトを環境から削除します

分類Dev

環境ビューモデルの子オブジェクト内の値の変更をサブスクライブします(これが発生したときにビューが再レンダリングされません)

分類Dev

クラス名を変更した後、「BinaryFormatter」を介してシリアル化されたオブジェクトを回復することは可能ですか?

分類Dev

複数のソースから最後に放出されたオブジェクトを取得します

分類Dev

さまざまな環境のページオブジェクトを処理するための最良の方法は何ですか?

分類Dev

ConcurrentBagのオブジェクトを変更しますか?

分類Dev

svgオブジェクトの色を変更しますか?

Related 関連記事

  1. 1

    環境rのオブジェクトの名前を変更します

  2. 2

    Javaの「最終」キーワードはどのように機能しますか?(私はまだオブジェクトを変更できます。)

  3. 3

    環境オブジェクトを変更し、SwiftUIで別のオブジェクトからデータをクリアします

  4. 4

    環境変数を変更した後、フィクスチャにオブジェクトを正しくインポートする方法

  5. 5

    Postman:JSONオブジェクトを環境変数に保存して、別のリクエストにチェーンすることはできますか?

  6. 6

    関数を使用してPython環境からすべての変数/オブジェクトを削除します

  7. 7

    Postman の環境変数を介して JavaScript オブジェクトにアクセスできません

  8. 8

    オブジェクトの値を最後のJavaScriptにカットします

  9. 9

    Pythonは、スクリプトの最後に環境変数を自動的に設定解除しますか?

  10. 10

    Javascriptは、ループの最後の1つだけをJSONオブジェクトに保存しました

  11. 11

    javascriptは、promiseオブジェクトが内部にあるforループの最後の反復のみの出力を示します

  12. 12

    javascript オブジェクト全体を反復処理し、type のすべての値を変更します

  13. 13

    JavaScriptまたはjQueryを使用して配列内にあるオブジェクトの値を変更するにはどうすればよいですか?

  14. 14

    最後から2番目のオブジェクトまで、マップを使用してオブジェクトの配列を反復処理します

  15. 15

    リポジトリインターフェイスは、forループ内にある場合に最後のオブジェクトインスタンスのみを保存し、一括挿入は保存前にオブジェクトを変更します

  16. 16

    ブラウザ環境からPuppeteerのノード環境にオブジェクトをどのように返しますか?

  17. 17

    配列オブジェクトの中央/最初に挿入した後、配列オブジェクトのキーを変更します

  18. 18

    配列オブジェクトの中央/最初に挿入した後、配列オブジェクトのキーを変更します

  19. 19

    内部的には、JavaScriptはオブジェクトキーをどのように反復しますか?

  20. 20

    最後の要素の前のオブジェクトを取得したい。しかし、nullを返します

  21. 21

    JavaFXはキャンバスから最後に描画されたオブジェクトを削除します

  22. 22

    forEach、[]。forEach.call(...)またはArray.prototype.slice.call(...)。forEachを使用して配列のようなオブジェクトを反復しますか?

  23. 23

    特定のパターンに一致するオブジェクトを除くすべてのオブジェクトを環境から削除します

  24. 24

    環境ビューモデルの子オブジェクト内の値の変更をサブスクライブします(これが発生したときにビューが再レンダリングされません)

  25. 25

    クラス名を変更した後、「BinaryFormatter」を介してシリアル化されたオブジェクトを回復することは可能ですか?

  26. 26

    複数のソースから最後に放出されたオブジェクトを取得します

  27. 27

    さまざまな環境のページオブジェクトを処理するための最良の方法は何ですか?

  28. 28

    ConcurrentBagのオブジェクトを変更しますか?

  29. 29

    svgオブジェクトの色を変更しますか?

ホットタグ

アーカイブ