単盞性はどれほど䟿利ですか



JavaScriptのパフォヌマンスずブログの投皿では、 単盞コヌドの重芁性が匷調されるこずがよくありたすが、通垞、単盞/倚盞ずは䜕か、なぜ重芁なのかに぀いおは明確な説明がありたせん。 私自身のスピヌチでさえ、信じられないほどのハルクの二分法に垰着するこずがよくありたす。 2皮類の悪い」 パフォヌマンスに関するアドバむスを求められるず、ほずんどの堎合、モノモヌフィズムずは䜕か、ポリモヌフィズムはどこから来お、䜕が悪いのかを説明するように頌たれたす。

「倚型」ずいう蚀葉自䜓が倚くの意味を持っおいるずいう事実によっお、状況は耇雑になっおいたす。 叀兞的なオブゞェクト指向プログラミングでは、ポリモヌフィズムは、基本クラスの動䜜をオヌバヌラむドできる子クラスの䜜成に関連付けられおいたす。 Haskellプログラマヌは、代わりにパラメトリック倚盞性に぀いお考えるでしょう。 ただし、JavaScriptパフォヌマンスレポヌトで譊告されるポリモヌフィズムは、関数呌び出しのポリモヌフィズムです 。

このメカニズムを非垞に倚くの方法で説明したので、ようやく集たっおこの蚘事を曞きたした。今では即興ではなく、単にリンクを匵るこずができたす。

私はたた、物事を説明する新しい方法を詊みたした-短い挫画の圢で仮想マシンのコンポヌネントの盞互䜜甚を描いおいたす。 さらに、この蚘事では、重芁ではない、冗長である、たたは盎接関連しおいないず芋なした詳现に぀いおは説明したせん。

ダミヌの動的怜玢



簡単にするために、䞻にJavaScriptのプロパティぞの最も基本的な呌び出し以䞋のコヌドのoxなどを怜蚎したす。 同時に、ここで説明しおいるこずはすべお、プロパティたたは算術挔算子の呌び出しであるかどうかにかかわらず、 動的バむンディングを䜿甚するすべおの操䜜に適甚され、JavaScriptだけでなく適甚できるこずを理解するこずが重芁です。

 function f(o) { return ox } f({ x: 1 }) f({ x: 2 }) 

Interpretators LLCの優秀なポゞションに぀いおむンタビュヌを受け、JavaScript仮想マシンのプロパティにアクセスするためのメカニズムを考えお実装するように求められたす。 最も平凡で単玔な答えは䜕でしょうか

ECMAScript仕様ECMA 262から既補のJSセマンティクスを取埗し 、英語の単語の[[Get]]アルゎリズムの単語をC ++、Java、Rust、Malbolge、たたは䜿甚する他の蚀語に曞き換えるよりも簡単なものを芋぀けるのは難しいむンタビュヌのために。

䞀般的に、ランダムなJSむンタヌプリタヌを開くず、次のようなものが衚瀺される可胜性が高くなりたす。


 jsvalue Get(jsvalue self, jsvalue property_name) { // 8.12.3    [[Get]] } void Interpret(jsbytecodes bc) { // ... while (/*    */) { switch (op) { // ... case OP_GETPROP: { jsvalue property_name = pop(); jsvalue receiver = pop(); push(Get(receiver, property_name)); // TODO(mraleph):    strict mode,    8.7.1  3. break; } // ... } } } 

これはプロパティ呌び出しを実装する絶察に正しい方法ですが、1぀の重倧な欠点がありたす。最新のJS仮想マシンず比范しお、実装が非垞に遅いです。

むンタプリタは健忘症に悩たされたす。プロパティにアクセスするたびに、プロパティを怜玢するための䞀般化されたアルゎリズム党䜓を実行する必芁がありたす。 圌は以前の詊みからは孊ばず、毎回最高額を支払わざるを埗たせん。 したがっお、パフォヌマンス指向の仮想マシンはプロパティアクセスを異なる方法で実装したす。


ここで、すでに芋たオブゞェクトに関する情報を取埗しお、それを同様のオブゞェクトに適甚できるようになったら 理論的には、これにより、䞀般的なアルゎリズムではなく、特定の圢状のオブゞェクトに最も適したアルゎリズムを䜿甚するこずで、倚くの時間を節玄できたす。

ランダムオブゞェクト内のプロパティの怜玢は時間がかかる操䜜であるため、䞀床実行しお、オブゞェクトの圢匏をキヌずしお䜿甚しお芋぀かったパスをキャッシュするこずをお勧めしたす。 次回同じ圢状のオブゞェクトに出䌚ったずき、最初から蚈算するよりもはるかに高速にキャッシュからパスを取埗するこずが可胜になりたす。

この最適化手法は、 むンラむンキャッシングず呌ばれ、 以前にそれに぀いおすでに曞いおいたす。 この蚘事では、実装の詳现に぀いおは説明したせんが、これたで蚀及しなかった2぀の重芁な点に泚意したす。他のキャッシュず同様に、むンラむンキャッシュにはサむズ 特定の時点でキャッシュされるアむテムの数ず容量 アむテムの最倧数、キャッシュできたす。

䟋に戻りたす。

 function f(o) { return ox } f({ x: 1 }) f({ x: 2 }) 

oxむンラむンキャッシュにはいく぀の゚ントリがありたすか

{x: 1}ず{x: 2}は同じ圢状 隠されたクラスず呌ばれるこずもあるであるため、答えは1です。monomorphicず呌ぶのはこのキャッシュ状態です。

モノ "one"+モヌフ "form"






しかし、異なる圢状のオブゞェクトで関数fを呌び出すずどうなりたすか

 f({ x: 3 }) //  ox    f({ x: 3, y: 1 }) //  ? 

オブゞェクト{x: 3}ず{x: 3, y: 1}は圢状が異なるため、キャッシュには{x: *}甚ず{x: *, y: *}甚の2぀の゚ントリが含たれおいたす。 操䜜はポリモヌフィズムレベル2でポリモヌフィックになりたした。

さたざたな圢状のオブゞェクトをfに転送し続けるず、むンラむンキャッシュの容量制限に達するたでポリモヌフィズムのレベルが増加したすたずえば、V8では、プロパティにアクセスするための容量制限は4になりたす。 その埌、キャッシュはメガモヌフィック状態になりたす。

 f({ x: 4, y: 1 }) // ,  2 f({ x: 5, z: 1 }) // ,  3 f({ x: 6, a: 1 }) // ,  4 f({ x: 7, b: 1 }) //  


キャッシュが制埡䞍胜に成長するのを防ぐために、メガモヌフィック状態が必芁であり、本質的には「フォヌムが倚すぎるため、さらに远跡するのは無意味です」ずいう意味です。 V8仮想マシンでは、メガモヌフィック状態のキャッシュは匕き続き䜕かをキャッシュできたすが、ロヌカルではなくグロヌバルハッシュテヌブルにキャッシュできたす。 サむズは固定されおおり、衝突が発生した堎合、倀は䞊曞きされたす。




理解床をテストするための小さな挔習

 function ff(b, o) { if (b) { return ox } else { return ox } } ff(true, { x: 1 }) ff(false, { x: 2, y: 0 }) ff(true, { x: 1 }) ff(false, { x: 2, y: 0 }) 

  1. ff関数で宣蚀されおいるむンラむンプロパティアクセスキャッシュはいく぀ですか
  2. 圌らはどのような状態ですか

答え
2぀のキャッシュがあり、同じ圢状のオブゞェクトのみがそれぞれに該圓するため、䞡方ずも単盞です。


パフォヌマンスぞの圱響


この段階で、さたざたなむンラむンキャッシュ状態のパフォヌマンスが明らかになりたす。


実際、これは真実の半分に過ぎたせん盎接的なコヌドアクセラレヌションに加えお、むンラむンキャッシュは党胜の最適化コンパむラヌのサヌビスでスパむずしおも機胜したす。これは遅かれ早かれ、コヌドをさらに高速化したす。

仕様ず最適化


むンラむンキャッシュは、次の2぀の理由で単独で最倧のパフォヌマンスを提䟛するこずはできたせん。


 function g(o) { return ox * ox + oy * oy } g({x: 0, y: 0}) 

䞊蚘の䟋では、7぀のむンラむンキャッシュがありたす.xに2぀、 .yに2぀、 * 2぀、 + 1぀です。 それぞれが独立しお動䜜し、オブゞェクトがキャッシュされたフォヌムに準拠しおいるかどうかをチェックしたす。 +挔算子の算術キャッシュは、䞡方のオペランドが数倀であるかどうかをチェックしたすが、これは*挔算子キャッシュの状態から掚枬できたす。 さらに、V8には数倀の内郚衚珟がいく぀かあるため、これも考慮されたす。

JSの䞀郚の算術挔算には、固有の特定のタむプがありたす。たずえばa | 0 a | 0垞に32ビット敎数を返し、 +aは単なる数字ですが、他のほずんどの操䜜ではそのような保蚌はありたせん。 このため、JS甚のAOTコンパむラヌを䜜成するのは非垞に困難です。 JSコヌドを事前に䞀床コンパむルする代わりに、ほずんどのJS仮想マシンにはいく぀かの実行モヌドがありたす。

たずえば、V8は最初にすべおを通垞のコンパむラでコンパむルし、すぐに実行を開始したす。 埌で、頻繁に䜿甚される関数は最適化を䜿甚しお再コンパむルされたす。 䞀方、Asm.jsは暗黙的なタむプの操䜜を䜿甚し、その助けを借りお、静的型付けを䜿甚したJavascriptの非垞に厳密に限定されたサブセットを蚘述したす。 そのようなコヌドは、アダプティブコンパむルを掚枬するこずなく、起動前でも最適化できたす。

コヌドを「りォヌムアップ」するには、次の2぀の目的が必芁です。


䞊蚘のように、人々のJavaScriptコヌドには通垞、完党に静的に入力しおAOTコンパむルするのに十分な情報が含たれおいたせん。 JITコンパむラは、プログラムの動䜜を掚枬し、特定の仮定の䞋でのみ適切な最適化コヌドを生成する必芁がありたす。 ぀たり、最適化された関数で䜿甚されるオブゞェクトを知る必芁がありたす。 幞運なこずに、これはたさにむンラむンキャッシュが収集する情報です。



最適化コンパむラは、むンラむンキャッシュによっお収集された情報を分析し、そこから䞭間衚珟  IR を構築したす。 IR呜什は通垞、JSでの操䜜よりも具䜓的で䜎レベルです。 たずえば、 .xプロパティにアクセスするためのキャッシュが{x, y}圢匏のオブゞェクトのみを芋た堎合、コンパむラはオブゞェクトぞのポむンタから固定オフセットで倀を受け取るIR呜什を生成できたす。 もちろん、着信オブゞェクトにこの最適化を䜿甚するこずは安党ではないため、コンパむラはその前に型チェックも远加したす。 型チェックは、オブゞェクトの圢状ず予想される圢状を比范し、それらが異なる堎合、最適化されたコヌドを実行できたせん。 代わりに、最適化されおいないコヌドが呌び出され、そこから実行が継続されたす。 このプロセスは最適化解陀ず呌ばれたす 。 最適化が解陀される唯䞀の理由は、タむプの䞍䞀臎だけではありたせん。 たた、32ビット数の算術挔算が「シャヌプ化」され、前の挔算の結果がオヌバヌフロヌを匕き起こした堎合、たたは存圚しない配列むンデックスarr[idx] 範囲倖、隙間のある疎配列などにアクセスした堎合にも発生したす。 。。


䞊蚘の欠点を解消するには最適化が必芁であるこずが明らかになりたす。

最適化されおいないコヌド最適化されたコヌド
各操䜜には未知の副䜜甚があり、完党なセマンティクスを実装したす。コヌドの特殊化は䞍確実性を排陀たたは制限し、副䜜甚は厳密に知られおいたすたずえば、オフセットによるプロパティの呌び出しにはそれらがありたせん
各操䜜は独自に行われ、独立しお孊習し、経隓を隣人ず共有したせん操䜜は、䞀緒に最適化される䜎レベルのIR呜什に分解され、冗長性が排陀されたす。


もちろん、特定の圢匏のオブゞェクト甚にIRを構築するこずは、最適化チェヌンの最初のステップにすぎたせん。 䞭間衚珟が圢成されるず、コンパむラはそれを数回調べお、䞍倉匏を怜出し、䜙分な郚分を切り取りたす。 このタむプの分析は通垞、プロシヌゞャの範囲に制限されおおり、コンパむラヌは各呌び出しで考えられる最悪の副䜜甚を考慮するこずを䜙儀なくされたす。 呌び出しは、指定されおいない操䜜で非衚瀺にできるこずに泚意しおください。たずえば、 +挔算子はvalueOfを呌び出すこずができ、プロパティにアクセスするずそのゲッタヌメ゜ッドが呌び出されたす。 したがっお、最初の段階で操䜜を指定できなかった堎合、オプティマむザヌの埌続のすべおのパスはその操䜜で぀たずきたす。

冗長な呜什の最も䞀般的なタむプの1぀は、同じオブゞェクトが同じ圢状であるこずを垞にチェックするこずです。 これは、最初の䞭間衚珟が䞊蚘の䟋から関数g探す方法です。

  CheckMap v0, {x,y} ;; shape check v1 Load v0, @12 ;; load ox CheckMap v0, {x,y} v2 Load v0, @12 ;; load ox i3 Mul v1, v2 ;; ox * ox CheckMap v0, {x,y} v4 Load v0, @16 ;; load oy CheckMap v0, {x,y} v5 Load v0, @16 ;; load oy i6 Mul v4, v5 ;; oy * oy i7 Add i3, i6 ;; ox * ox + oy * oy 

ここでは、倉数v0オブゞェクトの圢状が4回チェックされたすが、チェックの間に倉曎を匕き起こす可胜性のある操䜜はありたせん。 気配りのある読者は、 v2ずv5ロヌドも冗長であるこずに気付くでしょう。コヌドが䞊曞きされないためです。 幞いなこずに、その埌のグロヌバル番号付けのパスにより、これらの指瀺が削陀されたす。

 ;;   CheckMap v0, {x,y} v1 Load v0, @12 i3 Mul v1, v1 v4 Load v0, @16 i6 Mul v4, v4 i7 Add i3, i6 

䞊蚘のように、これらの呜什間に副䜜甚のある操䜜がなかったために、これらの呜什を削陀するこずが可胜になりたした。 ダりンロヌドv1ずv2間に呌び出しがあった堎合、 v0のオブゞェクトの圢状を倉曎できるず想定する必芁があるため、 v2の圢匏の確認は必須です。

操䜜が単盞ではない堎合、コンパむラは䞊蚘の䟋ず同じ「フォヌムの怜蚌ず具䜓化された操䜜」の束を単玔にずるこずはできたせん。 むンラむンキャッシュには、いく぀かのフォヌムに関する情報が含たれおいたす。 それらのいずれかを䜿甚しお、それだけを結び付けるず、残りはすべお最適化解陀に぀ながりたすが、これは望たしくありたせん。 代わりに、コンパむラは決定朚を構築したす 。 たずえば、 oxプロパティにアクセスするむンラむンキャッシュがフォヌムA、B、Cのみにox堎合、展開された構造は次のようになりたすこれは擬䌌コヌドです。実際、 制埡フロヌグラフが構築されたす。

 var o_x if ($GetShape(o) === A) { o_x = $LoadByOffset(o, offset_A_x) } else if ($GetShape(o) === B) { o_x = $LoadByOffset(o, offset_B_x) } else if ($GetShape(o) === C) { o_x = $LoadByOffset(o, offset_C_x) } else { //  ox   A, B, C //   ,  **     $Deoptimize() } //     ,  o   //   - A, B  C.     , //   

モノモヌフィックコヌルには、ポリモヌフにはない非垞に䟿利なプロパティが1぀ありたす。副䜜甚を䌎う次の操䜜たで、オブゞェクトの圢状が倉曎されないこずが保蚌されたす。 ポリモヌフィック凊理は、「オブゞェクトがいく぀かの圢匏の1぀を持っおいる」ずいう匱い保蚌のみを提䟛し、最適化はほずんどできたせん最適な堎合、最埌の比范ず最適化解陀のブロックを削陀するこずは可胜ですが、V8はそれを行いたせん。

䞀方、V8は、フィヌルドがすべおのフォヌムで同じオフセットにある堎合、効果的な䞭間衚珟を圢成できたす。 この堎合、ポリモヌフィックフォヌム怜蚌が䜿甚されたす。

 // ,       A, B  C -   $TypeGuard(o, [A, B, C]) //  ,        var o_x = $LoadByOffset(o, offset_x) 

2぀のポリモヌフィックチェックの間に副䜜甚のある操䜜がない堎合、モノモヌフィックチェックの堎合のように、2番目のポリモヌフィックチェックも䞍芁ずしお削陀できたす。

むンラむンキャッシュがオブゞェクトの可胜な圢匏に぀いおコンパむラに情報を枡すず、コンパむラはグラフ内で䞍適切に分岐するこずにより、各オブゞェクトに察しお䜕をすべきかを刀断できたす。 この堎合、わずかに異なるグラフが生成され、最終的には最適化解陀ではなく、䞀般化された操䜜が行われたす。

  var o_x if ($GetShape(o) === A) { o_x = $LoadByOffset(o, offset_A_x) } else if ($GetShape(o) === B) { o_x = $LoadByOffset(o, offset_B_x) } else if ($GetShape(o) === C) { o_x = $LoadByOffset(o, offset_C_x) } else { //  ,    ox . //      //   : o_x = $LoadPropertyGeneric(o, 'x') // ^^^^^^^^^^^^^^^^^^^^    } //       "" //    ,   //    

堎合によっおは、コンパむラは操䜜を指定するずいう考えを完党に攟棄する堎合がありたす。


これらのかなりたれな堎合、コンパむラは䞭間衚珟の䞀般化バヌゞョンを生成したす。

パフォヌマンスぞの圱響


その結果、次のこずができたす。


翻蚳者のメモ著者はマむクロベンチマヌクぞのリンクを提䟛したしたが、サむト自䜓は機胜しなくなりたした。

非共有


この蚘事があたりにも広範にならないように、意図的にいく぀かの実装の詳现には觊れたせんでした。

フォヌム


フォヌムたたは非衚瀺のクラスの配眮方法、蚈算方法、オブゞェクトぞの割り圓お方法に぀いおは説明したせんでした。 䞀般的なアむデアは、AWP2014での 以前の蚘事たたはプレれンテヌションから入手できたす。

JS仮想マシンの「フォヌム」の抂念そのものがヒュヌリスティックな近䌌であるこずを芚えおおく必芁がありたす。 人の芖点から芋た堎合、2぀のオブゞェクトの圢状は同じであっおも、機械の芖点から芋るず異なる堎合がありたす。

 function A() { this.x = 1 } function B() { this.x = 1 } var a = new A, b = new B, c = { x: 1 }, d = { x: 1, y: 1 } delete dy // a, b, c, d -     V8 

JSのオブゞェクトは蟞曞ずしお気楜に実装されおいるため、ランダムポリモヌフィズムを適甚できたす。

 function A() { this.x = 1; } var a = new A(), b = new A(); //   if (something) { ay = 2; //  a      b } 

意図的な倚型


䜜成されたオブゞェクトの圢状を倉曎できない倚くの蚀語Java、C、Dart、C ++などでは、ポリモヌフィズムもサポヌトされおいたす。 むンタヌフェむスに基づいお特定の実装に応じお実行されるコヌドを蚘述する機胜は、非垞に重芁な抜象化メカニズムです。 静的に型付けされた蚀語では、ポリモヌフィズムは同様の方法でパフォヌマンスに圱響したす。

圓然のこずながら、JVMはむンラむンキャッシュを䜿甚しおinvokeinterfaceおよびinvokevirtualを最適化しinvokevirtual 。

すべおのキャッシュが同じように圹立぀わけではありたせん。


䞀郚のキャッシュはオブゞェクトの圢匏に基づいおいない、および/たたは他のキャッシュよりも容量が少ないこずに留意しおください。 たずえば、関数呌び出しのむンラむンキャッシュには、初期化されおいない、単盞、たたは倧圢の3぀の状態しかありたせん。 関数を呌び出すためにオブゞェクトの圢状は重芁ではありたせんが、関数オブゞェクト自䜓はキャッシュされるため、䞭間のポリモヌフィック状態はありたせん。

  function inv(cb) { return cb(0) } function F(v) { return v } function G(v) { return v + 1 } inv(F) // - ,   F inv(G) // -   

関数がinv最適化され、むンラむンキャッシュが単盞状態にある堎合、オプティマむザヌは関数の本䜓を呌び出しの堎所に埋め蟌むこずができたすこれは、頻繁に呌び出される堎所の短い関数にずっお特に重芁です。キャッシュがメガモヌフィック状態にある堎合、オプティマむザヌはどの関数のどのボディを埋め蟌むこずができるかを知らないため、䞀般化された呌び出し挔算子は䞭間衚珟のたたになりたす。

䞀方、次の圢匏のメ゜ッドの呌び出しom(...)プロパティ参照のように機胜したす。メ゜ッド呌び出しのむンラむンキャッシュは、䞭間のポリモヌフィック状態を持぀こずもできたす。 V8仮想マシンは、プロパティず同じ方法で、そのような関数ぞの呌び出しを単盞、倚盞、さらにはメガモルフィック圢匏で埋め蟌むこずができたす。唯䞀の制限がありたすメ゜ッドはオブゞェクトの圢匏で含たれる必芁がありたす。

実際、om(...)䞀床に2぀のむンラむンキャッシュを䜿甚したす。1぀はプロパティをロヌドし、もう1぀は関数を盎接呌び出すために䜿甚したす。関数の䞊蚘の䟋のように、2番目には2぀の状態しかありたせんcb。したがっお、その状態は呌び出しの最適化䞭に無芖され、プロパティにアクセスするむンラむンキャッシュの状態のみが䜿甚されたす。

  function inv(o) { return o.cb(0) } var f = { cb: function F(v) { return v }, }; var g = { cb: function G(v) { return v + 1 }, }; inv(f) inv(f) // -   , //     f inv(g) //    ,   //  f    g 

䞊蚘の䟋fでgは、圢状が異なるこずは予想倖のように思われるかもしれたせん。これは、関数をオブゞェクトプロパティに割り圓おるず、V8は可胜であればオブゞェクト自䜓ではなくオブゞェクトのフォヌムにアタッチしようずするためです。䞊蚘の䟋でfはformが{c: F}あり、フォヌム自䜓はクロヌゞャヌを参照しおいたす。このフォヌムの前のすべおの䟋には、特定のプロパティの存圚の兆候のみが含たれおいたした。この堎合、その倀は保持され、フォヌムはJavaやC ++などの蚀語のクラスに䌌たものになりたす。

もちろん、埌でプロパティを別の関数で䞊曞きするず、V8はクラスずメ゜ッドの関係ずは芋えなくなるず芋なし、フォヌムが倉曎されたす。

 var f = { cb: function F(v) { return v }, }; //  f  {cb: F} f.cb = function H(v) { return v - 1 } //  f  {cb: *} 

V8がオブゞェクトのフォヌムをどのように構築および維持するかに぀いおは、別の倧きな蚘事を曞く䟡倀がありたす。

プロパティぞのパスの衚珟


この時点で、プロパティにアクセスするむンラむンキャッシュはox、クラス内の圢状やオフセットを比范する蟞曞のようDictionary<Shape, int>です。実際、そのような衚珟は深さを䌝えたせん。プロパティは、プロトタむプチェヌン内のオブゞェクトの1぀に属しおいる堎合や、アクセスメ゜ッドを持぀堎合がありたす。明らかに、ゲッタヌセッタヌを持぀プロパティは、デヌタを持぀通垞のプロパティよりも特定性が䜎いず芋なされたす。

たずえば、オブゞェクトo = {x: 1}は、仮想マシンのメ゜ッドを䜿甚しお、プロパティが特別な非衚瀺スロットに倀をロヌドおよび保存するオブゞェクトずしお衚すこずができたす。

 // ,  o = { x: 1 } var o = { get x () { return $LoadByOffset(this, offset_of_x) }, set x (value) { $StoreByOffset(this, offset_of_x, value) } // /    //     JS- }; $StoreByOffset(o, offset_of_x, 1) 

ずころで、プロパティはDart VMでほがこのように実装されおいたす。

このように芋れば、Dictionary<Shape, Function>フォヌムをアクセサヌ関数ず比范するこずで、むンラむンキャッシュがフォヌムに衚瀺される可胜性が高くなりたす。オフセットのある玠朎な衚珟ずは異なり、プロトタむプチェヌン、ゲッタヌセッタヌ、ES6のプロキシオブゞェクトのプロパティを蚘述するこずができたす。

準単盞条件


V8の䞀郚のむンラむンキャッシュには、premonomorphicず呌ばれる別の状態がありたす。䞀床だけアクセスされるキャッシュのコヌドをコンパむルしたせん。あたり知られおいない実装機胜であるため、この条件に぀いおは蚀及したせんでした。

最終的なパフォヌマンスのヒント


最高のパフォヌマンスのヒントは、デむルカヌネギヌの本「How to Stop Worrying and Start Living」のタむトルから匕甚できたす。

実際、倚型を心配するこずは通垞無意味です。代わりに、通垞のデヌタを䜿甚しおコヌドを実行し、プロファむラヌでボトルネックを探したす。JSに関連する堎合は、コンパむラヌが生成する䞭間衚珟を確認する必芁がありたす。

そしお、ロヌドされたサむクルの途䞭で、名前の䞋に呜什が衚瀺されるXYZGenericか、䜕かが属性でマヌクされおいる堎合changes [*]぀たり、「すべおを倉曎する」、それからそしおその埌のみ心配し始めるこずができたす。

Source: https://habr.com/ru/post/J303542/


All Articles