CPUサむクルでの運甚コスト

すべおの人に良い䞀日を そこで、コヌスでC ++のトピックに取り組み、叀き良き䌝統に埓っお、プログラムを準備する際に十分興味深いず感じたこず、およびトレヌニング䞭に觊れる内容を共有したす。



むンフォグラフィック







コヌドを最適化する必芁がある堎合は、プロファむルを䜜成しお簡玠化する必芁がありたす。 ただし、最初から非効率なこずをしないようにそしお、できればプログラムを埌でプロファむリングしないように、いく぀かの䞀般的な操䜜の抂算コストを単玔に芋぀けるこずが理にかなっおいる堎合がありたす。



CPUサむクルでの特定の操䜜のコストを評䟡するのに圹立぀むンフォグラフィック-「ちょっず、L2の読み取り操䜜には通垞どれくらいの費甚がかかるの」 これらのすべおの質問に察する回答は倚かれ少なかれ知られおいたすが、それらがすべお䞀芧衚瀺され、遠近法で提瀺されおいる単䞀の堎所を知りたせん。 厳密に蚀えば、蚘茉されおいるコストは最新のx86 / x64プロセッサにのみ適甚されたすが、倧芏暡なマルチレベルキャッシュARM Cortex AやSPARCなどを備えた他の最新のプロセッサでも同様のコスト比が芋られるこずが予想されたす。 䞀方、MCUARM Cortex Mを含むはたったく異なるため、䞀郚のパタヌンが適甚されない堎合がありたす。



最埌に、重芁なこずですが、譊告ここでのすべおの芋積もりは順序を瀺しおいるだけです。 ただし、さたざたな操䜜の違いの倧きさを考えるず、これらの指瀺は匕き続き䜿甚できたす少なくずも「早すぎる悲芳化」は避けおください。



䞀方で、「ちょっず、仮想関数の呌び出しは䜕の䟡倀もない」ず蚀わなければ、そのような図は圹に立぀ず確信しおいたす。 代わりに、䞊蚘のむンフォグラフィックを䜿甚するず、3 GHzの呚波数のプロセッサで仮想関数を毎秒100K呌び出すず、おそらくプロセッサの総量の0.2以䞊のコストはかかりたせん。 ただし、同じ仮想関数を毎秒10M呌び出すず、仮想化がプロセッサコアの2桁の割合を吞収するこずを簡単に意味する可胜性がありたす。



同じ質問に近づくもう1぀の方法は、「ちょっず、10,000サむクルのコヌドごずに仮想関数を1回呌び出すので、仮想化はプログラムの時間の1以䞊を消費したせん」ず蚀うこずですが、それでも䜕らかの方法が必芁です関連するコストの倧きさのオヌダヌを参照しおください-䞊蚘のチャヌトは匕き続き有甚です。



次に、䞊蚘のむンフォグラフィックのポむントを詳しく芋おみたしょう。



ALUおよびFPU操䜜



私たちの目的では、ALU操䜜ずいえば、倧文字ず小文字を区別しない操䜜のみを考慮したす。 メモリが関䞎しおいる堎合、コストはたったく異なる可胜性がありたす。以䞋に説明するように、メモリにアクセスするずきの「キャッシュミスの倧きさ」に䟝存したす。



「簡単な」操䜜



珟圚および最新のプロセッサ、ADD / MOV / OR / ...などの「単玔な」操䜜は、単䞀のCPUクロックサむクルよりも簡単に高速に実行できたす。 これは、操䜜が文字通り半分のバヌ内で実行されるこずを意味したせん。 それどころか、すべおの操䜜は敎数のメゞャヌで実行されたすが、それらの䞀郚は䞊行しお実行できたす 。



[Agner4] ちなみに、IMHOはプロセッサ操䜜を評䟡するための最良のリファレンスガむドですでは、この機胜は各操䜜を特城付ける2぀の量の存圚に反映されたす。1぀は遅延垞に敎数のクロックサむクルで衚されたす、もう1぀はパフォヌマンスです。 ただし、珟実の䞖界では、順序の掚定範囲を超える堎合、正確な時間はプログラムの性質ず、コンパむラが䞀芋無関係な呜什を提䟛した順序に倧きく䟝存するこずに泚意しおください。 芁するに、埅機順序よりも優れたものが必芁な堎合は、特定のコンパむラでコンパむルされた特定のプログラムをプロファむルする必芁がありたす理想的には、特定のタヌゲットプロセッサでも。



このようなメ゜ッドの詳现な説明「アりトオブオヌダヌ実行」ずしお知られおいるは、本圓に興味深いものであり、ハヌドりェア指向すぎたすアりトオブオヌダヌ操䜜の効率を䜎䞋させる䟝存関係の数を枛らすためにプロセッサフ​​ヌドの䞋で発生する「レゞスタの呜名」はどうでしょうか、そしお、明らかに珟圚の焊点にはありたせん。



敎数の乗算/陀算



敎数の乗算/陀算は、䞊蚘の「単玔な」操䜜ず比范しお非垞に高䟡です。 [ Agner4 ]は、1〜7サむクル実際には、3〜6サむクルなど、より狭い範囲の倀を芳枬したで32/64ビット乗算M86 / x64の䞖界ではMUL / IMULのコスト、および32/64ビットのコストを掚定したす陀算x86 / 64ではDIV / IDIVずしお知られおいたす-箄12-44サむクル。



浮動小数点挔算



浮動小数点挔算のコストは[ Agner4 ]から取られ、 加算では1〜3 CPUサむクルFADD / FSUB、乗算では2-5サむクルFMULから陀算では37-39サむクルFDIVたで倉化したす。



スカラヌSSE操䜜「すべおの犬」が今日䜿甚しおいるようですを䜿甚するず、むンゞケヌタヌは乗算で0.5-5サむクルMULSS / MULSD、陀算で1-40サむクルDIVSS / DIVSD; ただし、実際には、陀算には10〜40サむクルを予想する必芁がありたす1サむクルは実際にはめったに実珟されない「盞互垯域幅」です。



128ビットのベクトル挔算



数幎間、CPUは「ベクトル」操䜜より正確には、単䞀呜什耇数デヌタたたはSIMD操䜜をサポヌトしおきたした。 Intelの䞖界ではSSEおよびAVX、ARMの䞖界ではARM Neonずしお知られおいたす。 デヌタの「ベクトル」で機胜し、デヌタが同じサむズSSE2-SSE4の堎合は128ビット、AVXおよびAVX2の堎合は256ビット、今埌のAVX-512の堎合は512ビットが面癜いのは面癜いですが、さたざたな方法で解釈できたす。 たずえば、128ビットのSSE2レゞスタは、a2぀のdouble、b4぀のfloat、©2぀の64ビット敎数、d4぀の32ビット敎数、e8぀の16ビット敎数、f 16個の8ビット敎数。



[ Agner4 ]は、ベクトルが4×32ビット敎数ずしお解釈される堎合は<1メゞャヌで、128ビットベクトル䞊の敎数加算を掚定し、2×64ビット敎数である堎合は4メゞャヌを掚定したす。 乗算4×32ビットは1〜5クロックサむクルず掚定されたす-最埌にチェックしたずき、x86 / x64呜什セットには敎数ベクトル陀算挔算はありたせんでした。 128ビットベクトルでの浮動小数点挔算は、加算で1〜3 CPUサむクル、乗算で1〜7 CPUサむクル、最倧17〜69サむクルの陀算で掚定されたす。



遷移遅延



蚈算のコストに関連する明癜なこずは、敎数呜什ず浮動呜什の切り替えが無料ではないずいうこずではありたせん。 [ Agner3 ]は、プロセッサに応じお0〜3クロックサむクルでこのコスト「遷移遅延」ず呌ばれるを掚定したす。 実際、問題はより䞀般的であり、CPUに応じおベクトルSSE敎数呜什ず通垞のスカラヌ敎数呜什を切り替えるずペナルティが生じる堎合がありたす。



最適化のヒントパフォヌマンスが重芁なコヌドでは、浮動小数点ず敎数の蚈算を組み合わせないでください。



分岐



次に説明するのは、コヌドの分岐です。 遷移プログラム内の堎合は、基本的に比范ず呜什カりンタヌの倉曎です。 これらは䞡方ずも単玔ですが、分岐は非垞に高䟡になる可胜性がありたす。 これがなぜそうなのかずいう議論は、やはりハヌドりェア指向です特に、パむプラむン凊理ず投機的実行に圱響したすが、゜フトりェア開発者の芳点からは、次のようになりたす。





この遅延の持続時間は、最新のIntelプロセッサヌの堎合、10〜20クロックサむクルず掚定されたす-箄15〜20クロックサむクル[ Agner3 ]。



GCC __builtin_expectマクロは分岐予枬に圱響を䞎えるず考えられおいたすが、15幎前にはそのように機胜しおいたしたが、少なくずもIntelプロセッサヌCore 2以降からその。

[ Agner3 ]で説明されおいるように、最新のIntelプロセッサでは、分岐予枬は垞に動的ですたたは少なくずも動的な決定が支配的です。 これは、__ builtin_expectコヌドからの予想される逞脱が遷移の予枬に圱響を䞎えないこずを意味したす最新のIntelプロセッサヌ䞊。 ただし、以䞋の「メモリぞのアクセス」セクションで説明するように、__ builtin_expectは䟝然ずしおコヌドの生成方法に圱響したす。



メモリアクセス



80幎代、プロセッサ速床はメモリレむテンシに匹敵したしたたずえば、4 MHzで動䜜するZ80プロセッサは、レゞスタ間呜什で4クロックサむクル、レゞスタずメモリ間呜什で6クロックサむクルを費やしたした。 圓時は、アセンブリを芋るだけでプログラムの速床を蚈算するこずができたした。



それ以降、プロセッサの速床は3桁向䞊し、メモリのレむテンシは10〜30倍皋床しか向䞊しおいたせん。 残りの30を超える䞍敎合に察凊するために、これらのタむプのキャッシュはすべお導入されたした。 最新のプロセッサには通垞、3぀のキャッシュレベルがありたす。 その結果、メモリぞのアクセス速床は、「読み取ろうずしおいるデヌタはどこにあるのか」ずいう質問に察する答えに倧きく䟝存したす。 リク゚ストが芋぀かったキャッシュレベルが䜎いほど、速く取埗できたす。



L1およびL2キャッシュアクセス時間は、[Intel.Skylake]などの公匏ドキュメントに蚘茉されおいたす。 それぞれ4/12/44プロセッササむクルでのL1 / L2 / L3ぞのアクセス時間を掚定したす泚これらの数倀は、プロセッサモデルごずにわずかに異なりたす。 䞀般的に、[ Levinthal ]で述べたように、キャッシュが別のコアず共有されおいる堎合、L3ぞのアクセス時間は75クロックサむクルに達する可胜性がありたす。



ただし、芋぀けにくいのは、メむンRAMぞのアクセス時間に関する情報です。 [ Levinthal ]は、60nsプロセッサが3GHzで動䜜しおいる堎合、玄180クロックサむクルず掚定しおいたす。



最適化のヒント デヌタの局所性を改善したす。 詳现に぀いおは、たずえば[ NoBugs ]を参照しおください。



メモリからの読み取りに加えお、曞き蟌みもありたす。 盎芳的には、曞くこずは読むこずよりも高䟡であるず認識されおいたすが、たいおいはそうではありたせん。 この理由は簡単です。プロセッサは、蚘録が完了するのを埅っおから先に進む必芁はありたせん代わりに、曞き蟌みを開始するだけで、すぐに他のものに進みたす。 これは、ほずんどの堎合、プロセッサが1クロックサむクルで蚘録できるこずを意味したす。 これは私の経隓ず䞀臎しおおり、[ Agner4 ]ず非垞によく盞関しおいるようです。 䞀方、システムがメモリ垯域幅に関連付けられおいる堎合、数倀は非垞に倧きくなる可胜性がありたす。 それにもかかわらず、私が芋たものから、曞き蟌み操䜜でバスをオヌバヌロヌドするこずは非垞にたれなこずなので、ダむアグラムに反映したせんでした。



デヌタに加えお、コヌドがありたす。



もう1぀の最適化のヒントコヌドの局所性も改善しおください。 これはそれほど明癜ではありたせん原則ずしお、デヌタのロヌカリれヌションが䞍十分な堎合よりもパフォヌマンスぞの圱響は少なくなりたす。 コヌドの局所性を改善する方法の議論は[ Drepper ]にありたす。 これらのメ゜ッドには、むンラむン化、__ builtin_expectなどが含たれたす。



䞊蚘のように__builtin_expectはIntelプロセッサでの遷移の予枬には圱響したせんが、コヌドのマヌクアップには圱響し、コヌドの空間的局所性に圱響するこずに泚意しおください。 その結果、__ builtin_expectは、最新のIntelプロセッサARMでは-正盎なずころ、わかりたせんではあたりにも顕著な効果はありたせんが、それでもパフォヌマンスにある皋床圱響する可胜性がありたす。 MSVCでは、条件挔算子のif遷移ずelse遷移が__builtin_expectに䌌た効果をもたらすこずも報告されおいたす提案された遷移が2぀の遷移を持぀条件挔算子のif遷移である堎合が、これは疑わしいはずです。



NUMA䞍均等なメモリアヌキテクチャ



メモリアクセスずパフォヌマンスに関連するもう1぀のこずは、デスクトップコンピュヌタヌではめったに芋られたせんこれにはマルチプロセッサマシンが必芁です-マルチコアマシンず混同しないでください。 したがっお、䞻にサヌバヌのパラフィです。 ただし、これはメモリアクセス時間に倧きく圱響したす。



耇数の゜ケットが関係する堎合、珟代のプロセッサはいわゆるNUMAアヌキテクチャを実装する傟向があり、各プロセッサ「プロセッサ」=「゜ケットに挿入される」には独自のRAMがありたす以前のFSBアヌキテクチャずは異なり、フロントサむドバスず共有RAM。 各プロセッサは独自のRAMを持っおいるずいう事実にもかかわらず、CPUはRAMアドレス空間を共有したす-そしお、物理的に別のRAMにアクセスする必芁があるずきはい぀でも、QPIやHypertransportなどの超高速プロトコルを介しお別の゜ケットにリク゚ストを送信するこずで行われたす。



驚いたこずに、あなたが予想するほど長くはありたせん-デヌタがリモヌトプロセッサのL3キャッシュにある堎合、[ レビンタル ]は100-300 CPUサむクルを提䟛し、デヌタが存圚しない堎合は100ns〜= 300サむクルずリモヌトプロセッサを提䟛したすこのデヌタのためにメむンRAMにアクセスする必芁がありたした。



CAS亀換ずの比范



時々特に、非ブロッキングアルゎリズムで、ミュヌテックスを実装するずき、いわゆるアトミック操䜜を䜿甚するこずがありたす。 通垞、CASCompare-And-Swapずしお知られる1぀のアトミック操䜜のみが孊術的に考慮されたす他のすべおがCASを介しお実装できるずいう理由で。 通垞、実際にはもっず倚くありたすたずえば、C ++ 11のstd :: atomic、WindowsではInterlocked *、GCC / Linuxでは__sync _ * _および_ *を参照しおください。 これらの操䜜はかなり奇劙な動物です。特に、適切な操䜜のためには特別なCPUサポヌトが必芁です。 x86 / x64では、察応するASM呜什はLOCKプレフィックスによっお特城付けられるため、x86 / x64䞊のCASは通垞LOCK CMPXCHGず蚘述されたす。



珟圚の芳点から、CASなどのこれらの操䜜は、通垞のメモリアクセスよりもはるかに長く実行されるこずが重芁です原子性を保蚌するために、プロセッサは、少なくずも異なるコア間、たたはマルチ゜ケット構成の堎合、異なるメモリ間でもプロセスを同期する必芁がありたす゜ケット。



[ AlBahra ]は、CAS操䜜のコストを玄15〜30サむクルx86ずIBM Powerファミリヌでわずかに異なるで芋積もっおいたす。 この数は、2぀の仮定が満たされた堎合にのみ正圓化されるこずに泚意する䟡倀がありたす。aシングルコア構成で䜜業しおいるこず、およびb比范するメモリがすでにL1にあるこず。



マルチ゜ケットNUMA構成でのCASのコストに関しおは、CASでデヌタを芋぀けるこずができなかったので、掚枬なしではできたせん。 䞀方で、「リモヌト」メモリのCAS遅延を゜ケット間のHyperTransport回路よりも小さくするこずはほずんど䞍可胜であり、これはNUMA L3キャッシュを読み取るコストに匹敵したす。



䞀方、これらの指暙を超える理由は本圓にありたせん:-)。 その結果、100〜300 CPUサむクルでのNUMAの個別のCASおよびCASに類䌌した操䜜のコストを芋積もりたす。



TLB連想翻蚳バッファヌ



最新のプロセッサず最新のOSを䜿甚する堎合は垞に、アプリケヌションレベルで通垞「仮想」アドレススペヌスを扱いたす。 ぀たり、10個のプロセスを実行するず、これらの各プロセスは独自のアドレス0x00000000を持぀こずができたすおそらくそうなりたす。 この分離をサポヌトするために、プロセッサはいわゆる「仮想メモリ」を実装しおいたす。 x86の䞖界では、1982幎に80286で導入された「保護モヌド」によっお最初に実装されたした。



通垞、「仮想メモリ」はペヌゞごずに機胜したすx86の堎合、各ペヌゞのサむズは4Kたたは2M、たたは少なくずも理論的には1Gでも、CPUが実行䞭のプロセスを認識しおいる堎合すべおのメモリアクセスのアドレス。 すべおのプロセッサレゞスタマヌクアップを凊理するものを陀くが「仮想メモリ」圢匏のすべおのポむンタを含むずいう意味で、この再マヌキングは完党に舞台裏で行われるこずに泚意しおください。



そしお、「マヌクアップ」に぀いお話し始めたので、このマヌクアップに関する情報はどこかに保存する必芁がありたす。 さらに、このマヌクアップ仮想アドレスから物理アドレスぞはすべおのメモリアクセスで発生するため、高速である必芁がありたす。 通垞、これには特別な皮類のキャッシュが䜿甚されたす。これは、Associative Translation BufferTLBず呌ばれたす。

他のタむプのキャッシュず同様に、TLBミスコストがありたす。 x64の堎合、7〜21 CPUサむクル[ 7cpu ]の範囲です。 䞀般に、TLBの圱響は非垞に困難です。 ただし、いく぀かの掚奚事項を匕き続き提䟛できたす。





゜フトりェアプリミティブ



これで、ハヌドりェアに盎接関連するこずは完了したした。゜フトりェアに関連するいく぀かのこずに぀いお説明したす。 それらは本圓にどこにでもあるので、䜿甚するたびにどれだけ䜿うかを芋おみたしょう。



C / C ++での関数呌び出し



最初に、C / C ++で関数を呌び出すコストを芋おみたしょう。 実際、C / C ++で関数を呌び出すものは、呌び出す前に倚くのこずを地獄で行い、呌び出し先も黙っお座っおいたせん。



[ Efficient C ++ ]は、パラメヌタヌの数に応じお25〜250クロックサむクルで関数を呌び出すためのCPUコストを掚定したす。 しかし、これはかなり叀い本であり、私は同じ口埄のより良い参照を持っおいたせん。 䞀方、私の経隓では、パラメヌタヌの数がかなり少ない関数の堎合、これはおそらく15〜30サむクルになりたす。 [ eruskin ]が発芋したように、これはIntel以倖のプロセッサヌにも圓おはたるようです。



最適化のヒント必芁に応じおむンラむン関数を䜿甚したす。 ただし、最近では、コンパむラはほずんどの堎合、組み蟌み仕様を無​​芖したす。 したがっお、非垞に重芁なコヌドスニペットの堎合、GCCには__attribute __always_inlineを䜿甚し、MSVCには__forceinlineを䜿甚しお必芁な凊理を実行できたす。 ただし、それほど重芁ではないコヌドスニペットにこれらの匷制むンラむンを䜿甚しないでください。これにより、さらに悪化する可胜性がありたす。



ずころで、倚くの堎合、埋め蟌みから埗られる利益は、単に通話を削陀するコストを超える堎合がありたす。 これは、埋め蟌みによりかなりの数の远加の最適化ハヌドりェアパむプラむンの適切な䜿甚を保蚌するための䞊べ替えに関連するものを含むが提䟛されるずいう事実によるものです。 たた、埋め蟌みによりコヌドの空間的局所性が向䞊するこずを忘れないでください。これは少し圹立ちたすたずえば[ Drepper ]を参照。



間接呌び出しず仮想呌び出し



䞊蚘の説明は、通垞の「盎接」関数呌び出しに関連しおいたした。 間接呌び出しず仮想呌び出しのコストは高いこずが知られおおり、倚くの人は間接呌び出しが分岐を匕き起こすこずに同意したすただし、同じコヌドポむントから同じ関数を呌び出す限り、[ Agner1 ]で瀺されおいるように、最新のプロセッサの遷移予枬メカニズムはこれを非垞によく予枬できたす。そうしないず、10〜30クロックサむクルの誀った予枬に察しおペナルティが発生したす。 仮想呌び出しに関しおは、これは1回の远加読み取りVMTポむンタヌの読み取りであるため、その時点ですべおが通垞どおりキャッシュされる堎合、さらに4プロセッサヌサむクル皋床に぀いお話したす。



䞀方、実甚的な枬定[ eruskin ]は、仮想関数のコストが小さな関数の盎接呌び出しのコストの玄半分であるこずを瀺しおいたす。 誀差範囲「順序」内で、これは䞊蚘の分析ず䞀臎しおいたす。



最適化のヒント 仮想呌び出しが高䟡な堎合は、代わりにC ++でテンプレヌトの䜿甚いわゆるコンパむル時ポリモヌフィズムの実装を怜蚎できたす。 CRTPは、これを行う唯䞀の方法です唯䞀の方法ではありたせん。



配分



今日、アロケヌタヌは非垞に高速です。 特に、tcmallocずptmalloc2アロケヌタヌは、小さなオブゞェクト[ TCMalloc ]の割り圓お/解攟に200〜500 CPUサむクルしか䜿甚できたせん。



ただし、割り圓おに関連する重芁な譊告があり、割り圓おを䜿甚する間接的なコストに远加されたす割り圓おは、叀き良き経隓則のように、メモリの局所性の䜎䞋を意味し、それがパフォヌマンスに悪圱響を及がしたす盞互䜜甚のため䞊蚘の非キャッシュメモリを䜿甚。 これが実際にどれほど悪いかを説明するために、[ NoBugs ]の20行のプログラムを芋おみたしょう。 このプログラムは、ベクタヌ<>を䜿甚する堎合、リスト<>を䜿甚する同等のプログラムよりも100から780倍高速に実行されたすコンパむラヌず特定のフィヌルドに䟝存したす。



最適化のヒント プログラムの割り圓お数を枛らすこずを怜蚎しおください。特に、ほずんどの䜜業が読み取り専甚デヌタで行われる段階がある堎合は考えおください。 堎合によっおは、デヌタ構造の平滑化぀たり、遞択したオブゞェクトをパックされたオブゞェクトに眮き換えるにより、プログラムを最倧5倍高速化できたす。



トピックに関する実際のストヌリヌ。 昔々、ギガバむトのRAMを䜿甚するプログラムがありたしたが、これは倧きすぎるず考えられおいたした。 わかりたした、私はそれを「フラット化」バヌゞョンに曞き盎したした぀たり、各ノヌドは最初に動的に構築され、次に同等の読み取り専甚「フラット化」オブゞェクトがメモリに䜜成されたした。 「スムヌゞング」のアむデアは、メモリの量を枛らすこずでした。 プログラムを開始するず、メモリ量が2倍枛少しただけでなく予想どおり、非垞に良い副䜜甚のように、実行速床が5倍増加したこずがわかりたした。



OSカヌネル呌び出し



私たちのプログラムがオペレヌティングシステムで動䜜する堎合はい、それなしでも動䜜するプログラムがただありたす、システムAPIのグルヌプ党䜓がありたす。 実際には少なくずも通垞のOSに぀いお話しおいる堎合、これらのシステムコヌルの倚くはカヌネルコヌルに぀ながりたす。これには、カヌネルモヌドぞの切り替えやその逆も含たれたす。 これには、異なる「保護リング」間の切り替えIntelプロセッサヌでは、通垞「リング3」ず「リング0」の間が含たれたす。 プロセッサレベルの切り替えには玄100クロックサむクルしかかかりたせんが、これに関連する他のオヌバヌヘッドは通垞カヌネルコヌルをはるかに高䟡にするため、通垞のカヌネルコヌルには少なくずも1000-1500プロセッササむクルかかりたす[ Wikipedia.ProtectionRing ]。



C ++䟋倖



珟圚、C ++䟋倖は、機胜するたで䟡倀がないず蚀われおいたす。 それは本圓に䜕もありたせん-それはただ100明確ではありたせんIMOはそのような質問がたったく尋ねられるかどうかさえ明確ではありたせんが、それは確かに非垞に近いです。



ただし、これらの「コストがかからずただ䜜業を行わない」実装は、䟋倖が発生するたびに実行する必芁がある膚倧な䜜業の背埌にありたす。 スロヌされた䟋倖のコストは莫倧であるこずに誰もが同意したすが、い぀ものように実隓デヌタはほずんどありたせん。 ただし、[ Ongaro ]実隓では、玄5,000プロセッササむクルペストのおおよその数が埗られたす。 さらに、より耇雑なケヌスでは、この数倀はさらに倧きくなるず予想されたす。



゚ラヌの返华ず怜蚌



䟋倖の䞀時的な代替方法は、゚ラヌコヌドを返し、各レベルでチェックするこずです。 この皮のパフォヌマンス枬定に぀いおは蚀及しおいたせんが、合理的な実隓を行うのに十分なこずはすでにわかっおいたす。 それを詳しく芋おみたしょう゚ラヌが発生した堎合のパフォヌマンスに぀いおはあたり気にしたせんので、すべおが正垞である堎合は評䟡に集䞭したす。



原則ずしお、返品および確認費甚は3぀の個別の費甚で構成されたす。 これらの最初のものは条件付き遷移自䜓のコストであり、99 +の堎合に正しく予枬されるず安党に仮定できたす。 ぀たり、この堎合の条件付きゞャンプのコストは玄1〜2サむクルです。 2番目のコストぱラヌコヌドをコピヌするコストであり、それがレゞスタ内にある限り、これは単玔なMOVです。これらの状況では、0〜1クロックサむクルです0クロックサむクルは、MOVに远加コストがないこずを意味したす。他の操䜜ず䞊行しお実行されたす。 3番目のコストはそれほど明癜ではありたせん-これは、゚ラヌコヌドを運ぶために必芁な远加のレゞスタのコストです。 — PUSH/POP ( ), , + L1 1 + 4 . , , PUSH/POP , ; , x86 ; x64 ( ) , PUSH/POP , ( , , , PUSH/POP).



, ---- ( ) 1 7 . , , , 10000 , , , ; , 100 , , , . , — « ».







, , , , . , . , « » (, , nginx Apache), « »?



10000 ; , . , , , « ». [ LiEtAl ], .









, , .



, , ( ), , , , - — , .



終わり



,



All Articles