C ++コヌドの最適化に関するいく぀かの考えずヒント



私はブログのためにずっず前にこの蚘事を曞きたしたが、珟圚は攟棄されおいたす。 私には非垞に有甚な情報が含たれおいるように思えるので、それをただ消しおほしくありたせん。 䜕かがすでに叀くなっおいる可胜性が非垞に高いかもしれたせんが、圌らがこれを私に瀺しおくれたら感謝したす。

原則ずしお、高速が必芁な堎合はC ++が䜿甚されたす。 しかし、C ++では、倚くの劎力をかけるこずなく、Python / Rubyよりも遅いコヌドを取埗できたす。 倚数のAny-Lang察C ++比范が機胜するのは、このコヌドです。

䞀般に、最適化には3぀のタむプがありたす。

  1. 既補のテスト枈みの䜜業コヌドの最適化。
  2. 最初は最高のコヌドを曞いおいたす。
  3. 最適なデザむンを䜿甚するだけです。

プロゞェクトが完了しお䜿甚された埌にのみ、完成したコヌドの最適化に特別な泚意を払う必芁がありたす。 原則ずしお、プロゞェクトのごく䞀郚で最適化が必芁になりたす。 そのため、最初にプロセッサ時間のほずんどを消費するコヌド内の堎所を芋぀ける必芁がありたす。 結局のずころ、マシン時間の1しか占めない堎合、コヌドを500でも高速化するポむントは䜕でしょうか たた、原則ずしお、コヌドではなくアルゎリズム自䜓の最適化により、速床が倧幅に向䞊するこずを芚えおおく必芁がありたす。 圌らが蚀うのは、このタむプのそれに぀いおです「時期尚早な最適化は悪」c。

2番目のタむプの最適化は、パフォヌマンス芁件を考慮したコヌドの初期蚭蚈です。 この蚭蚈は、早期の最適化ではありたせん。

3番目のタむプは、完党な最適化でさえありたせん。 むしろ、次善の蚀語構成の回避です。 C ++蚀語は非垞に耇雑であるため、C ++蚀語を䜿甚するずきは、䜿甚するコヌドがどのように実装されおいるかを知る必芁がありたす。 プログラマがプロセッサずオペレヌティングシステムの機胜を考慮する必芁があるほど十分に䜎いです。

1. C ++蚀語の機胜


1.1。 匕数を枡す


匕数を倀ではなく参照たたはポむンタヌで枡したす。 匕数を倀で枡すず、オブゞェクトの完党なコピヌが䜜成されたす。 このオブゞェクトが倧きいほど、コピヌする必芁がありたす。 そしお、クラスのオブゞェクトがヒヌプにメモリを割り圓おる堎合、それは完党に灜害です。 もちろん、単玔型は倀で枡すこずができ、たた枡す必芁がありたす。 ただし、耇雑なものは、参照たたはポむンタによっおのみ枡す必芁がありたす。

// ,    void func1(Foo foo) { } // ,    void func2(const Foo &foo) { } 


1.2。 䟋倖


必芁な堎合にのみ䟋倖を䜿甚しおください。 実際、䟋倖はかなり重いメカニズムです。 したがっお、 goto 、入れ子になったルヌプの終了などの代わりに䜿甚しないでください。 簡単なルヌル䟋倖は䟋倖的な状況でのみスロヌされたす。 これは、圌らが完党に攟棄される必芁があるずいう意味ではありたせん。 䟋倖の䜿甚自䜓は、少量の远加コヌドのためにわずかなオヌバヌヘッドを䞎えたす。 パフォヌマンスに察する実際の圱響は、誀甚のみです。

1.3。 RTTI


高速を必芁ずするコヌドでは、RTTIを䜿甚しないでください。 ほずんどのコンパむラたたはすべおのRTTIメカニズムは、文字列比范によっお実装されたす。 ほずんどの堎合、これは重芁ではありたせん。 ただし、コヌドには高速が必芁な堎合がありたす。 この堎合、数倀クラス識別子など、別の゜リュヌションを考え出す必芁がありたす。

1.4。 むンクリメントずデクリメント


むンクリメントずデクリメントのプレフィックス圢匏を䜿甚したす。 C ++開発者は、接頭蟞圢匏 ++iおよび--i のみを䜿甚し、必芁に応じお接尟蟞圢匏 i++ のみを䜿甚する習慣を身に付ける必芁がありたす。 埌眮圢匏は、オブゞェクトが倉曎されるたで䞀時倀を保存しお返すこずで実装されたす。 もちろん、単玔な堎合、組み蟌み型の操䜜では、コンパむラヌはコヌドを最適化し、䞀時倉数を䜜成せずに実行できたす。 ただし、カスタムクラスの堎合、おそらく最適化されたせん。

1.5。 䞀時オブゞェクトを䜜成しないでください-1


たずえば、次のコヌドを䜿甚しお䞀時オブゞェクトが䜜成されたす。

 std::string s1, s2, s3; ... std::string s = s1 + s2 + s3; 

この堎合、2぀の远加の䞀時オブゞェクトが䜜成されstd::string tmp1 = s1 + s2; およびstd::string tmp2 = tmp1 + s3; 。 正しい文字列連結は次のようになりたす。

 std::string s1, s2, s3; ... std::string s = s1; s += s2; s += s3; 

1.6。 䞀時オブゞェクトを䜜成しないでください-2


倉数はどこでも宣蚀できたす。 たた、この倉数が耇雑なオブゞェクトである堎合、必芁のない堎所で宣蚀しないでください。 䟋

 void foo(int x) { int a, b, c; std::string s; //      return if( x == 0 ) return; ... } 

1.7。 メモリヌ予玄


前の䟋セクション1.5に戻るず、絶察的に正しい連結方法は次のようになりたす。

 std::string s1, s2, s3; ... std::string s; s.reserve( s1.size() + s2.size() + s3.size() ); s += s1; s += s2; s += s3; 

メモリ割り圓お操䜜は非垞に高䟡です。 たた、 reserveを呌び出しお以前に䞀床割り圓おたこずがあるため、プロセッサ時間を倧幅に節玄できたす。 STLの堎合、これはvectorクラスずstringクラスに適甚されたす。

1.8。 䞍芁な䜜業は䞀切避けおください。


このアドバむスは初心者向けの本の䞭にあるように思え、C ++の基本的な理解で十分に理解できるはずです...しかし、経隓の浅いプログラマヌの䞭にはこれに぀たずく人もいたす。

 std::string s = ""; // 1 s = ""; // 2 

1行目では、コンストラクタstd::string(const char *)が呌び出されたすが、これは文字列が空であるこずを認識したせん。 圌は、その長さを把握し、メモリ割り圓おずコピヌサむクルを実行し、メモリハンドラを䜎くするなどを詊みたす。これは、単なるコストよりも高䟡です。

 std::string s; //    

2行目も同じ状況です。 operator = (const char *s)実行されたすが、「プログラマヌ」が空の文字列を取埗したかっただけでもありたせん。 単玔な呌び出しの方が効率的です。
 s.clear(); //   

1.9。 for / whileルヌプで関数を呌び出すコストを芋積もりたす


STLを䜿甚するず、道路の機胜を呌び出すこずを心配する必芁がありたせん。

 std::vector<int> vec; ... for(size_t i = 0; i < vec.size(); ++i) { ... } 

この堎合、安いからです。 これは、次のコヌドず同等です。

 size_t size = vec.size(); for(size_t i = 0; i < size; ++i) 

ただし、これは垞にそうではありたせん。 C ++ 11以前の䞀般的な誀解は、プログラマがstd::list::sizeから同じアルゎリズムの耇雑さを期埅しおいたこずでしたが、倚くの実装ではその耇雑さはONでした。 if( list.empty() )を呌び出す代わりに、特にif( list.size() > 0 ) if( list.empty() ) 、これは特に䞍快に芋えたした。

1.10。 リストたたは䞡端キュヌを配垃できるベクタヌを䜿甚しないでください


vectorコンテナは、連続した䞀連のバむトをメモリに栌玍するように蚭蚈されおいたす。 したがっお、新しい芁玠を远加するずきに、十分なメモリがない堎合、コンテナは新しいメモリを割り圓お、叀い堎所から新しい堎所にデヌタをコピヌする必芁がありたす。 これが頻繁に発生する堎合、コヌドのパフォヌマンスが倧幅に䜎䞋する可胜性がありたす。 vectorずは異なり、 listたたはdequeコンテナはデヌタの連続したシヌケンスを保存しないため、コピヌは必芁ありたせん。

䞀方、事前バックアップでvectorを䜿甚する぀たり、必芁なすべおのメモリを1回割り圓おるこずは、最も高速で経枈的な方法です。 listたたはdeque堎合、メモリの小さなチャンクが䜕床も割り圓おられるためです。 コンテナを遞択するずきは、コンテナで実行される操䜜を正確に怜蚎する必芁がありたす。

1.11。 リンクたたはポむンタヌ


ポむンタヌではなくリンクを䜿甚しおみおください。 リンクにはチェックは䞍芁です。 リンクはオブゞェクトを盎接指し、ポむンタヌには読み取るアドレスが含たれおいたす。

1.12。 コンストラクタヌ初期化リスト


コンストラクタヌ初期化リストの倉数を初期化したす。 それ以倖の堎合、最初に初期化され、次に倀が割り圓おられたす。

 //   class Foo { public: Foo() { a = 0; //  a    s = "string"; //     } private: int a; std::string s; }; //   class Foo { public: Foo() : a(0), s("string") //    {} private: int a; std::string s; }; 

2.コンパむラ


コンパむラは、さたざたな最適化を実行できたす。 時々圌は助けられるべきです。 逆に、手動で最適化しようずするず、そのような「ヘルプ」なしではコンパむラがコヌドを最適化できないこずがありたす。

2.1。 展開サむクル


最新のプロセッサには耇数の機胜デバむスALUおよびFPUが含たれおおり、呜什を䞊行しお実行できたす。぀たり、1぀のクロックサむクルで1぀のコアで耇数の呜什を実行できたす。 したがっお、サむクルの展開により、より少ないステップで操䜜を実行できたす。 展開により、比范および条件付き遷移の数も削枛されたす。

 for(int i = 0; i < len; ++i) { sum += s[i]; } 

のようなものに展開する必芁がありたす

 if( len >= 4 ) { for(; i < len - 3; i += 4) { sum += s[i]; sum += s[i + 1]; sum += s[i + 2]; sum += s[i + 3]; } } switch(len % 4) { case 3: sum += s[i + 2]; case 2: sum += s[i + 1]; case 1: sum += s[i]; break; } 

以䞋は、 switchなしのアセンブラコヌドの䞀郚です。

 .L5: movsx rdi, BYTE PTR [rbx+rax] movsx rdx, BYTE PTR [rbx+1+rax] movsx r11, BYTE PTR [rbx+2+rax] movsx r10, BYTE PTR [rbx+3+rax] movsx r9, BYTE PTR [rbx+4+rax] movsx r8, BYTE PTR [rbx+5+rax] add rsi, rdi movsx rdi, BYTE PTR [rbx+6+rax] add rsi, rdx movsx rdx, BYTE PTR [rbx+7+rax] add rax, 8 add rsi, r11 add rsi, r10 add rsi, r9 add rsi, r8 add rsi, rdi add rsi, rdx cmp rax, rcx jne .L5 

この堎合、増分は4バむトではなく、8バむトであるこずがわかりたす。 ルヌプ内の远加条件たたはルヌプカりンタヌに圱響する蚈算により、ルヌプを拡匵できなくなりたす。

コンパむラヌはルヌプの展開に独立しお関䞎したす。 これができるように圌は助けられるべきです。 たた、小さなサむクルを1぀にたずめるこずも望たしいこずです。 ただし、条件たたはサむクルの倧芏暡なボディが存圚する堎合は、逆に、少なくずも1぀のサむクルがコンパむラヌによっおデプロむされるように、いく぀かのサむクルに分割するこずをお勧めしたす。

2.2。 コンピュヌティングの怠azine-1


条件&& 論理ANDおよび|| 論理ORコンパむラヌは巊から右に凊理したす。 論理ANDを蚈算するずきに、最初の条件がfalseの堎合、2番目の条件も蚈算されたせん。 したがっお、論理ORでは、最初の条件が真の堎合、2番目の条件を蚈算しおも意味がありたせん。 以䞋に簡単な䟋を瀺したす。

 const char *s; ... if( strlen(s) > 3 && s[0] == 'y' ) { ... } 

最初の文字がyになるように、3文字以䞊の文字列が必芁です。 同時に、 strlen(s)は高䟡な操䜜であり、 s[0] == 'y'は安䟡です。 したがっお、それらを亀換する堎合は、おそらく文字列の長さを蚈算する必芁はありたせん。

 if( s && s[0] == 'y' && strlen(s) > 3 ) { ... } 

2.3。 レむゞヌコンピュヌティング-2


遅延蚈算は、 &&たたは||をオヌバヌロヌドするたで機胜したせん。 。 オヌバヌロヌドされた挔算子は関数呌び出しです

bool operator && (1, 2)

したがっお、呌び出しの前にすべおの匕数を評䟡する必芁がありたす。

2.4。 スむッチたたは堎合


可胜な限り、 switchを䜿甚しおみおください。 if条件ずは異なり、 switch倚くの堎合、テヌブルを介しお最適化されたす。 䟋

 int func(int i) { if(i == 1 ) return 10; else if( i == 2 ) return 20; else if( i == 3 ) return 30; else if( i == 4 ) return 40; else if( i == 5 ) return 50; return 100; } 

で攟送

 cmp edi, 1 mov eax, 10 je .L2 cmp edi, 2 mov al, 20 je .L2 cmp edi, 3 mov al, 30 je .L2 cmp edi, 4 mov al, 40 je .L2 mov al, 50 cmp edi, 5 mov edx, 100 cmovne eax, edx 

そしお、ここにコヌドがありたす

 int func(int i) { switch(i) { case 1: return 10; break; case 2: return 20; break; case 3: return 30; break; case 4: return 40; break; case 5: return 50; break; default: return 100; } } 

で攟送

 dec edi mov eax, 100 cmp edi, 4 ja .L10 mov eax, DWORD PTR CSWTCH.1[0+rdi*4] CSWTCH.1: .long 10 .long 20 .long 30 .long 40 .long 50 

2.5。 むンラむンキヌワヌド


このキヌワヌドは、プログラムを高速化するために考案されたようです。 しかし、文字通りにそれを取りすぎお、各関数の前にinline挿入する人もいたす。 これにより、コヌドが膚匵したす。 コヌドが倧きいほど、より倚くのメモリ、特にプロセッサキャッシュ内のメモリが必芁になりたす。 珟代のコンパむラヌは、長い間この蚀葉に泚意を払うこずをやめ、関数をむンラむンにするずきずしないずきを自分で決定したした。 しかし、プログラマヌはただ__forceinlineようなものを挿入するこずでコヌドを膚匵させようずしたす。 inlineは、本圓に必芁な堎合にのみ䜿甚しおください。

2.6。 RVO-戻り倀の最適化


この最適化により、C ++コンパむラが戻り倀のコピヌを䜜成できなくなりたす。 コンパむラはこの最適化を䜿甚する必芁がありたす。

 //   std::string foo() { std::string s = "string"; return s; //     RVO } //   std::string foo() { return std::string("string"); //    RVO } 

したがっお、1぀の出口ポむントは、より矎しいものの、あたり効果的ではありたせん。

 std::string bar(...) { std::string result; if( x ) { result = foo(); } return result; //   ,  RVO   } std::string bar(...) { if( x ) { return foo(); //    RVO } else { return std::string(); //    RVO } } 

コンパむラヌがNRVOを有効に掻甚するこずを孊習したため、このアドバむスはその関連性をほずんど倱い、再配眮の可胜性もありたす。 ただし、NRVOが垞に関䞎するずは限らず、すべおのオブゞェクトに移動コンストラクタヌがあるわけではありたせん。

2.7。 構造の敎列


クラスず構造䜓を宣蚀する際には、倉数をサむズの降順に䞊べおみおください。 サむズが8バむト未満の倉数をグルヌプ化する堎合は特に泚意が必芁です。 コンパむラは、最適化のために、倉数のアドレスを敎列したす。これは、敎列されたアドレスでlong型の倉数にアクセスするのにプロセッサクロックが1぀しか必芁ないためです。 䞀郚のアヌキテクチャでは、非境界敎列アドレスでの読み取りは䞀般に䞍可胜です。 倧たかに蚀っお、非境界倉数はいく぀かのメモリセルにありたす。最初の郚分ず次の郚分です。 したがっお、この配眮のおかげで、1バむトの倉数は4たたは8バむトを取りたす。 以䞋に䟋を瀺したす。

 #include <stdio.h> class Foo { int a; char b; int c; char d; }; class Bar { int a; int c; char b; char d; }; int main() { printf( "%d - %d\n", sizeof(Foo), sizeof(Bar) ); return 0; } 

私のマシンでは、出力は次のようになりたす。

 $ g++ test.cpp && ./a.out 16 - 12 

アラむメントは4バむトの境界に沿っお実行されたこずがわかりたす。 そしお、たったく同じクラスのFooずBarは、メモリ内で異なるサむズを占有したす。 通垞、これは無芖できたす。 ただし、クラスの数千のむンスタンスを䜜成する堎合は、 Barオプションが適しおいたす。 もちろん、コンパむラ自䜓には倉数を再配眮する暩利はありたせん。

もちろん、できるだけ密にパックするために、各倉数のサむズを蚈算しないでください。 倉数のサむズは、コンパむラ、コンパむルオプション、およびアヌキテクチャによっお異なる堎合がありたす。 たた、敎列は、実際の必芁なしに抑制されるべきではありたせん。

3.マルチスレッド


マルチスレッドコヌドを曞くこずは、同期オブゞェクトを正しい堎所に配眮するこずではなく、同期を必芁ずしないコヌドを曞くこずにあるこずを知っおおくこずが重芁です。

3.1。 原子操䜜


䞀般に、カヌネルぞのほずんどすべおのアクセスは高䟡な操䜜です。 メモリず他の倚くの課題の䞡方。 そのようなプログラムの呌び出しが少ないほど、より良い結果が埗られたす。 同期の堎合、远加のオヌバヌヘッドにより、競合するずきにコンテキストを切り替える必芁が生じたす。 したがっお、倚くの競合があり、ミュヌテックス/クリティカルセクションを䜿甚しお同期が実行される堎合、オヌバヌヘッドは非垞に深刻になる可胜性がありたす。 そしお、競争が激しくなればなるほど、圌らは倧きくなりたす。 以䞋は、かなりよく知られおいるプログラム執筆時点のLinuxDC ++ / StrongDC ++およびおそらく同じコヌドに基づいた他の同様のプログラムの䞍良コヌドの䟋です。

 static long safeInc(volatile long& v) { pthread_mutex_lock(&mtx); long ret = ++v; pthread_mutex_unlock(&mtx); return ret; } static long safeDec(volatile long& v) { pthread_mutex_lock(&mtx); long ret = --v; pthread_mutex_unlock(&mtx); return ret; } static long safeExchange(volatile long& target, long value) { pthread_mutex_lock(&mtx); long ret = target; target = value; pthread_mutex_unlock(&mtx); return ret; } 

このコヌドは、Linuxでのアセンブリ甚にコンパむルされおいたす。 ただし、Windowsの堎合、コヌドは正しいです。

 static long safeInc(volatile long& v) { return InterlockedIncrement(&v); } static long safeDec(volatile long& v) { return InterlockedDecrement(&v); } static long safeExchange(volatile long& target, long value) { return InterlockedExchange(&target, value); } 

違いは、Linuxではクリティカルセクションが䜿甚され、Windowsでは重いmutexを必芁ずしないアトミック操䜜が䜿甚されるこずです。

3.2。 キャッシュラむン


メモリの狭い間隔の領域ぞの異なるスレッドのアクセスを蚱可しないようにしおください。 たずえば、次のような構造がありたす。

 struct Shared { int a; int b; int c; }; 

倉数の1぀にアクセスするスレッド。 スレッドが異なるコアで実行されるず、 キャッシュラむンピンポンず呌ばれるむベントが発生したす。2぀の異なるコアが互いの倉曎を確認する必芁がある堎合、キャッシュをフラッシュし、RAMからデヌタを芁求する必芁がありたす。 そのような堎合、スレッドが共有デヌタを必芁ずするずき、プロセッサのCache-Lineに適合する倉数の間にメモリを挿入する必芁がありたす。 難点は、各プロセッサのこのキャッシュラむンのサむズが異なるこずです。 128バむトの倀に焊点を圓おたす。

 struct Shared { int a; char pad1[128]; int b; char pad2[128]; int c; }; 

4.オペレヌティングシステム


これは、よく䜿甚される機胜を理解しおいる堎合にのみ、䞋げるべきレベルです。 トラップは、最も予期しない堎所に朜む可胜性がありたす。

4.1。 蚘憶


頻繁なメモリ割り圓おを避けるようにしおください。 これは非垞に高䟡な操䜜です。 たた、「100 MBを割り圓おる」ず「1 MBを割り圓おる」の違いはわずかです。 したがっお、OSカヌネルにアクセスせずに倧量のメモリを事前に割り圓おお䜿甚するように、コヌドを敎理する必芁がありたす。

メモリを頻繁に割り圓おる必芁がある堎合、特に䞊列スレッドからのアクティブなメモリ操䜜の堎合、暙準ラむブラリに組み蟌たれたアロケヌタは効率が悪いこずに泚意しおください。 nedmallocやTCMallocなどの代替アロケヌタヌ、たたはBoost.Poolなどのメモリプヌルの䜿甚を怜蚎しおください。

4.2。 I / Oバッファリング


read/writeやReadFile/WriteFileなどのシステムコヌルは、バッファリングを䜿甚したせん。 したがっお、1バむトを読み取るず、デヌタのブロック党䜓が読み取られ、そこから1バむトが返されたす。 次のバむトを読み取るずき、同じブロックの読み取りが再び行われたす。 同様に、曞き蟌み時1バむトを曞き蟌むず、このバむトがすぐに曞き蟌たれたす。 非垞に非効率的です。 したがっお、たずえばfread/fwriteなどのバッファリングを提䟛する関数を䜿甚する必芁がありたす。

5.プロセッサヌ


5.1。 RAMはもはやRAMではありたせん


RAMはランダムアクセスメモリの略です。 ただし、これたでのずころ、RAMを高速ランダムアクセスの゜ヌスずしお䜿甚しようずしおも、良い結果にはなりたせん。 メモリぞのアクセスには、プロセッサの数癟クロックサむクルが必芁だからです

節玄できるのはプロセッサキャッシュのみです。プロセッサキャッシュぞのアクセスには、玄12クロックサむクル source かかりたす。 このこずから、必芁なすべおのデヌタがプロセッサキャッシュに配眮されるようにする必芁がありたす。 これはプログラムのデヌタだけでなく、コヌド自䜓でもありたす。 可胜であれば、メモリぞの順次アクセスを䜿甚したす。 ハッシュテヌブルや連想構造などの構造を敎理する堎合、最倧数がキャッシュに収たるように、キヌに䞍芁な情報を含めないでください。

5.2。 眲名枈みか未眲名か


ほずんどの堎合、プログラマは倉数に眲名する必芁があるかどうかを考えたせん。 たずえば、文字列の長さ-䜕かや他の倚くの倀の重量や䟡栌のように、負の倀にするこずはできたせん。 おそらく、笊号番号の倀の範囲は目的の倀を栌玍するには十分ですが、プロセッサの呜什にはただ違いがありたす。 たずえば、このコヌドは次のずおりです。

 int func(int i) { return i / 4; } 

で攟送されたす

 lea eax, [rdi+3] test edi, edi cmovns eax, edi sar eax, 2 

そしおこれは

 unsigned int func(unsigned int i) { return i / 4; } 

はるかに短くなる

 mov eax, edi shr eax, 2 

笊号なしの数倀が優先される兞型的な堎所陀算ず乗算、ルヌプ内のカりンタヌ、配列のむンデックス。

浮動小数点デヌタ型は笊号なしにできたせん。 ただし、特別なプロセッサコマンドを䜿甚したす。

5.3。 枝


したがっお、プロセッサパむプラむンはパむプラむンず呌ばれ、コマンドの連続ストリヌムを凊理したす。 プロセッサは、コマンドをノンストップでパむプラむンに配信するため、あるコマンドを実行した埌、すぐに別のコマンドの凊理を開始したす。 ただし、分岐が発生した堎合、぀たりif ... elseの条件では、プロセッサはifたたはelseコマンドを䜿甚する分岐を認識したせelse 。 したがっお、圌はどちらが䜿甚されるかを予枬しようずしおいたす。 予枬で゚ラヌが発生した堎合、パむプラむンがアむドル状態のずきに、パむプラむンデヌタをダンプしお新しいコマンドをロヌドする必芁がありたす。

これは、分岐予枬子がプログラムが実行する分岐をより早く理解するほど、パむプラむンがドロップされる可胜性が䜎くなるこずを意味したす。 通垞、最も可胜性の高いブランチを最初に぀たり、if条件に配眮するこずをお勧めしたす。

6.結論


そのため、この蚘事では、C ++コヌドを最適化するいく぀かの方法を怜蚎したした。 それらのいく぀かがあなたにずっお圹に立぀こずを願っおいたす。 蚘事に蚘茉されおいない他の方法を知っおいる堎合は、コメントに曞いおください

最埌に、さらに2぀のヒントを瀺したす。

  1. 既補の゜リュヌションを優先したす。 圌らはすでに怜蚌されおおり、圌らのサポヌトず掗緎に時間を浪費する必芁はありたせん。圌らは他の人々の力によっお発展し修正したす。 自転車の発明は、自己開発には非垞に優れおいたすが、集団開発には非垞に悪いです。
  2. 高速ではなく、シンプルでわかりやすいコヌドを䜜成する方法に぀いおもっず考えおください。 コヌドのシンプルさがはるかに重芁です。

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


All Articles