web-dev-qa-db-ja.com

マイクロパフォーマンスと効率を気にする必要があるのはなぜですか?

C/C++ページの多くの質問と回答、特にまたは間接的にマイクロパフォーマンスの問題(間接vs直接vsインライン関数のオーバーヘッドなど)、またはO(N2)vs O(NログN)100アイテムリストのアルゴリズム。

私は常に、マイクロパフォーマンスについては気にせず、マクロパフォーマンスについてはほとんど気にせずにコードを作成します。

私の質問は、なぜ多くのプログラマーがそんなに気にかけるのですか?それはほとんどの開発者にとって本当に問題なのですか、それについてあまり心配しなくてもいいくらい幸運だったのですか、それとも私は悪いプログラマですか?

71
mattnz

実際には、パフォーマンスがその詳細レベルで管理する必要がある問題であることはめったにありません。大量のデータを保存および操作することがわかっている場合は、状況に注意する必要がありますが、それ以外の場合は、状況を単純にしておく方が適切です。

特にCやC++でそのようなきめ細かい制御が行われている場合、最も簡単な落とし穴の1つは、最適化が早すぎてレベルが高すぎることです。一般的なルールは次のとおりです。A)問題があることがわかるまで最適化しないでください。B)プロファイラーを使用して問題領域であることが判明していないものは最適化しないでください。

B)の当然の結果は次のとおりです。プログラマーは、パフォーマンスのボトルネックがどこにあるかを予測することは悪名高いですが、それが得意だと思っています。プロファイラーを使用して、遅い部分を最適化するか、コードの1つのセクションが何度も呼び出されている場合はアルゴリズムを変更して、問題を引き起こしています。

14
jwismar

私はあなたのリストのすべてがマイクロ最適化であると思います、それ以外は一般的に見られるべきではありません

o(n * n)vs O(NlogN)アルゴリズムを100アイテムリストで使用する

見ておくべきだと思います。確かに、そのリストは現在100アイテムであり、 すべてが小さいnの場合はすべて高速です ですが、同じコードが数百万行のリストで再利用されることをすぐに確信しています。コードはまだ合理的に機能する必要があります。

適切なアルゴリズムの選択は、マイクロ最適化しないです。同じコードが2か月後または2年後に使用されるデータの種類はわかりません。プロファイラーのガイダンスで簡単に適用できる「マイクロ最適化」とは異なり、アルゴリズムの変更では、新しいアルゴリズムを効果的に使用するために大幅な再設計が必要になることがよくあります。 (たとえば、一部のアルゴリズムでは、入力データを既にソートする必要があるため、アプリケーションの重要な部分を変更して、データがソートされたままであることを確認する必要がある場合があります)

54
Billy ONeal

ずいぶん前の私の最初の仕事で、組み込みシステム用のコードを書きました。これらのシステムは8086マイクロプロセッサを使用し、メモリが限られていました。インテルCコンパイラーを使用しました。私が構築した1つのシステムは、構造の3次元配列にアクセスする必要がありました。本が私に言ったように私はそれを構築しました:3つの次元に対してmallocを呼び出し、次に次の次元に行を割り当て、次に終了ノードに対してcallocを割り当てます。

当時はかなり複雑でしたが、カーブフィッティング、ANOVAプロセス制御、カイ2乗分析を行う必要がありました。これを行うライブラリはありませんでした。すべてを記述し、すべてを8086に合わせる必要がありました。

システムは犬のように動きました。迅速なプロファイリングの後で、最大の問題の1つがアロケータにあることがわかりました。問題を修正するために、mallocへのすべての呼び出しを中止し、1つの大きなメモリブロックの独自のメモリ管理を行いました。


同じ仕事の別のケースでは、顧客は統計的プロセス制御システムの応答時間について不満を言っていました。私の前のチームは、オペレーターがブールロジックを使用して信号とトリップスイッチを組み合わせることができる「ソフトウェアPLC」システムを設計していました。彼らはそれを私たちが今日「ドメイン固有言語」と呼ぶことになる、簡略化された言語で書いた。覚えていると((A1 + B1) > 4) AND (C1 > C2) 等々。

元のデザインは、評価されるたびにその文字列を解析して解釈しました。私たちの粗末なプロセッサでは、これは多くの時間を消費し、プロセスコントローラーがプロセスの実行速度ほど速く更新できないことを意味しました。

私はそれを再検討し、実行時にそのロジックをアセンブリコードに変換できると判断しました。私はそれを解析しましたonceそしてそれが実行されるたびに、アプリは動的に生成された関数を呼び出しました。ある種のウイルスが今日そうであるように、私は推測します(しかし、私は知りません。その結果、パフォーマンスが100倍になり、顧客と上司は本当に幸せになりました。

新しいコードは、カスタムcompilerを作成していたため、メンテナンスが容易ではありませんでした。しかし、パフォーマンスの利点は、メンテナンスの欠点を上回っています。


最近では、XMLフライを動的に解析する必要があるシステムに取り組んでいました。ファイルが大きいほど、かなり時間がかかります。これはパフォーマンスに非常に敏感でした。解析が遅すぎると、UIが完全に使用できなくなります。

こういうことはいつも出てきます。


ですから、メンテナンスが容易で、簡単に記述できるコードが必要な場合があります。すぐに実行されるコードが必要な場合があります。トレードオフは、各プロジェクトで行う必要があるエンジニアリング上の決定です。

18
Cheeso

大きな画像を処理してすべてのピクセルを反復処理する場合、パフォーマンスの微調整が重要になる可能性があります。

12
Steve Wellens

カルチャーの背後にあるwhyについて少しお話ししましょう。

20歳よりも40歳に近づき、成人時代を生きるようにプログラミングをしている場合、C++が町で唯一のゲームであり、デスクトップアプリが標準であり、ハードウェアはまだだった頃に成人しました。帯域幅/パフォーマンス機能の点でソフトウェアに大きく遅れをとっています。

  • large(> 2G)ファイルを読み取れるようにするために、愚かなプログラミングトリックを実行する必要がありました...
  • 以前は実行可能サイズを心配していました...
  • 私たちは、プログラムが消費するメモリの量を心配していました...
  • アルゴリズムによる時間とスペースのトレードオフの決定を定期的に行いました...
  • バックエンドでさえ、had CまたはC++でCGIプログラムを記述して、適切なnoを処理できるようにします。 RPSの...それは数桁高速でした。
  • 以前は、delphi/c ++/vb間のパフォーマンスのメリットについてテストを実行していました。

非常に今日、これらのことについて心配する必要がある人はほとんどいません。

ただし、10年前は、ソフトウェアが56kbモデム経由でダウンロードされ、5年前のPCで実行されることを心配する必要がありました。 4GBのハードドライブ、200Mhzのプロセッサ、128MbのRAMという観点から考えてみてください...

そして10年前のサーバー?デルの「次世代」サーバーの価格は2000ドルで、2(!)1 Ghzペンティアムプロセッサ、2 GbまたはRam、および20 Gbハードドライブが付属しています。

それは単に異なる球技であり、10年の経験を持つすべての「上級」エンジニア(あなたの質問に答えそうな人)歯を切る inその環境。

12
red-dirt

ここにはすでに10個の回答があり、いくつかは本当に良いものですが、これは私の個人的なペットのうんざりだからです...

a)単純なソリューションよりも実行に時間がかかる早期の最適化b)単純なソリューションではサイズが半分で複雑さが半分になるコードを導入し、c)可読性を低下させるので、絶対に避ける必要があります。ただし、開発者がstd :: mapまたはstd :: vectorのどちらを使用するかを選択し、時期尚早な最適化よりも悪くないにしても、パフォーマンスの純粋な無知から間違ったコレクションを選択した場合。今日コードをわずかに変更し、読みやすさを維持し、同じ複雑さを維持しながら、より効率的にできるとしたらどうでしょうか。それとも「時期尚早の最適化」と呼べますか?私は多くの人がそれをどうにか考えさえしないと思います。

変更をほとんど必要としない「マイクロ最適化」に助言した人になり、「早すぎる最適化はすべきではありません。それを機能させて、それを変更します。後でパフォーマンスの問題が発生した場合」を参照してください。修正するまでに数回のリリースが必要でした。そして、はい、それはパフォーマンスの問題でした。

初期の最適化は良くないかもしれませんが、人々がそのコードが何をしようとしているのかを理解してコードを記述し、O(x) =「最適化」であるという表記現時点で記述できるコードはたくさんあり、パフォーマンスについて少し考えれば、将来の問題の80%を回避できます。

また、パフォーマンスの問題の多くは、環境内では発生せず、すぐには発生しないことも考慮してください。場合によっては、限界に挑戦する顧客がいるか、別の開発者がフレームワークの上に構築してオブジェクトの数を10倍に増やすことにします。現在のパフォーマンスについては多少はありますが、後で非常にコストのかかる再設計を回避できます。また、ソフトウェアが正式にリリースされた後で問題が見つかった場合、単純な修正でさえ、20倍の費用がかかります。

したがって、結論として、常にパフォーマンスを念頭に置くと、良い習慣を身につけることができます。これらは、簡潔かつ可能な限り簡潔で整理されたコードを書くことと同じくらい重要です。

9
DXM

あなたが見ているものの多くは単純なサンプリングエラーだと思います。人々が簡単な状況に対処しているとき、彼らはコードを書きます、そしてそれは事の終わりです。特に最適化が必要であることが必ずしも明白ではない状況で、最適化が必要な場合など、比較的トリッキーなことに対処しているときに質問します。

とはいえ、疑いの余地なく時期尚早の最適化も含まれていることは間違いありません。 CとC++のパフォーマンスには定評があります。これは、パフォーマンスが気になる人(最適化を本当に必要とするのと同じくらい楽しむために最適化を行う人を含む)を引き付ける傾向があります。

6
Jerry Coffin

他のいくつかの回答では組み込みシステムについて言及していますが、これについて詳しく説明します。

たとえば、家のボイラーコントローラー、シンプルな電卓、または現代の車の中にある数十のチップなど、ローエンドプロセッサを搭載したデバイスはたくさんあります。

お金を節約するために、これらはフラッシュ(コードを保存するための)とRAM)の量を持っている可能性があります。比較的低いクロックレート。

例を挙げると、マイクロコントローラの STM32ファミリ24 MHz、16 KBのフラッシュと4 KBのRAM から最大 120 MHz、1 MBのフラッシュ)です。および128 KB RAM

このようなチップ用のコードを作成する場合、当然のことながらコードをできるだけ効率的にすることを目的とすると、時間を大幅に節約できます。明らかに、時期尚早な最適化は依然として悪い考えです。しかし、実践することで、一般的な問題をどのようにして迅速かつ/または最小限のリソースで解決できるかを学び、それに応じてコーディングします。

4
Steve Melnikoff

これらは本質的に低レベルの言語であり、99%の時間で問題とならない詳細がtheボトルネックを引き起こしている病理学的パフォーマンスケースに遭遇すると、実際に直接回避する機会があります問題(他のほとんどの言語とは異なります);もちろん、多くの場合、最も効果的な方法はすぐにはわかりません。したがって、奇妙で興味深いマイクロ最適化の質問の半分は、ここで尋ねられます。

残りの半分は、彼らが金属にどれだけ近づくことができるかについて知りたい人々から来ています。結局のところ、これらは基本的に低レベルの言語です...

2
ildjarn

CおよびC++を扱う場合、パフォーマンスは常にホットなトピックです。どこまで行けばよいのかについては、いつでもASMのインライン化、またはポインタ演算を使用してより高速な反復を実現できます。ただし、最適化に多くの時間を費やして、プログラム全体の開発に取り組むのが止まるところまで来ています。

これらの問題に対処する場合、プログラマーのパフォーマンスとコードのパフォーマンスがあります。これらのうちどれに焦点を当てるかは、常に興味深い質問を引き起こします。結局、最も重要な質問は、それがユーザーにとってどれほど目立つかです。ユーザーは、数百または数千の要素を持つ配列を作成するデータを操作しますか?この場合、処理を迅速に行うためのコーディングを行うと、プログラムの標準操作が遅いとユーザーから不満が出てくる可能性があります。

次に、少量のデータを操作するユーザーがいます。パフォーマンスを犠牲にしてより簡単に保守できるようにする高レベルの関数を使用している場合、並べ替えやファイル操作などの操作をユーザーが気づかないような、あちこちにあるいくつかのファイル。

これは、遭遇する問題のほんの一例です。その他の問題には、ターゲットユーザーのハードウェアが含まれます。エンベデッドシステムを扱う場合、たとえば、ユーザーがRAMのギグを備えたデュアルコアマシンを使用している場合は、パフォーマンスについてもっと心配する必要があります。

2
onteria_

なぜプログラマーはそんなに気にかけるのですか?彼らが頭に浮かんでいるのは、彼らが頭に浮かぶ前にパフォーマンスの問題を解決し、それらがいつ推測しているのかがわからないなどです。

私の経験では、事前に考えるべきべきパフォーマンスの問題があるため、これはトリッキーです。彼らが何であるかを知るには経験が必要です。

そうは言っても、私が使用する方法はあなたの方法と似ていますが、同じではありません。

  1. 可能な限りシンプルなデザインから始めます。特に、データ構造はできるだけ正規化し、最小限に抑える必要があります。不可避の冗長性がある限り、一貫性を保つための方法として通知を控えるべきです。一時的な不整合を許容し、定期的なプロセスで修復することをお勧めします。

  2. プログラムの開発中は、パフォーマンスの問題が静かに忍び込む方法があるため、定期的にパフォーマンスチューニングを行ってください。私が使用する方法は random-pausing です。

これが blow-by-blowの例 の意味です。

2
Mike Dunlavey

強力なパフォーマンス要求がまだある線形時間よりも優れていないアルゴリズムがある場合もあります。

例としては、すべてのピクセルをループせずに画像/フレームを基本的な例として明るくすることができないビデオ処理があります(まあ、私は、子によって継承されたプロパティを示すある種の階層構造で、最終的に画像タイルに降りることができると思いますリーフノードの場合は、すべてのピクセルをレンダラーにループするコストが高くなるため、コードはおそらく、最も最適化された画像フィルターよりも維持が難しくなります。

私の分野ではそのようなケースがたくさんあります。私は、あらゆる種類の洗練されたデータ構造またはアルゴリズムの恩恵を受けるものよりも、すべてに触れたりすべてを読み取ったりする必要がある線形複雑度ループを実行する傾向があります。すべてに触れなければならないときにスキップできる作業はありません。したがって、その時点で必然的に線形の複雑さに対処する場合は、反復ごとに実行する作業をどんどん安くする必要があります。

したがって、私の場合、最も重要で一般的な最適化は、多くの場合、データ表現とメモリレイアウト、マルチスレッディング、SIMDです(通常、この順序でデータ表現が最も重要です。後者の2つを実行する機能に影響するためです)。私は、ツリー、ハッシュテーブル、並べ替えアルゴリズム、およびそのようなものによって解決される多くの問題に遭遇していません。私の毎日のコードは、より詳しく"それぞれについて、何かをする。"

もちろん、最適化が必要な場合(さらに重要なのはそうでない場合)、micro orアルゴリズムについて説明するのは別のケースです。しかし、私の特定のケースでは、クリティカルな実行パスが最適化を必要とする場合、10x以上の速度向上は、マルチスレッド化、SIMD、参照の局所性を改善するためのメモリレイアウトとアクセスパターンの再配置などのマイクロレベルの最適化によって達成されることがよくあります。たとえば、バブルソートをイントロソートや基数ソートに置き換えたり、BVHを使用して2次複雑度の衝突を検出したりして、たとえばホットフィールドとコールドフィールドの分割からメリットを得られるホットスポットを見つけることはあまりありません。

今私の場合、私の分野はパフォーマンスが非常に重要です(レイトレーシング、物理エンジンなど)、画像をレンダリングするのに10時間かかる遅いが完全に正しいレイトレーサーは、完全にインタラクティブな高速のものよりも役に立たないと見なされることがよくありますが、防水レイ/トライの交差がないため、どこにでも光線が漏れている醜い画像を出力します。速度はおそらく間違いなくそのようなソフトウェアの主要な品質指標であり、間違いなくある時点までの正確さを超えています(「正確さ」は、クラッシュしない限り、すべてが近似しているため、レイトレーシングのあいまいな考えであるためです)。その場合、効率を前もって考えないと、より効率的な設計を処理するために、最も高価な設計レベルで実際にコードを変更する必要があることがわかります。ですから、レイトレーサーや物理エンジンのようなものを設計する際に、効率について前もって十分に考えていないと、生産や実際のユーザーが十分に有用であると見なす前に、のろわれたもの全体を書き直す必要があるかもしれません。エンジニア。

ゲームは私のものに似た別の分野です。ゲームがスライドショーのように1フレーム/秒で実行される場合、ゲームロジックがどれほど正確であるか、またはコードベースが保守可能で見事に設計されているかは問題ではありません。特定の分野では、速度の不足により、アプリケーションがユーザーにとって実際に役に立たなくなる可能性があります。ゲームとは異なり、レイトレーシングなどの領域には「十分な」測定基準はありません。ユーザーは常により速い速度を望んでおり、産業競争は主により速い解決策を模索しています。リアルタイムになるまで十分ではありません。その時点で、ゲームはパストレーサーを使用します。そして、アーティストは数十億のポリゴンをロードし、30以上のFPSで数十億のパーティクル間で自己衝突するパーティクルシミュレーションを実行する必要があるため、おそらくそれでもVFXには十分ではありません。

それでも快適なら、それでも、コードの90%はスクリプト言語(Lua)で記述し、パフォーマンスはまったく気にしません。しかし、実際には何百万から何十億ものものをループする必要のある異常に大量のコードがあり、何百万から何十億ものものをループしているとき、単純なシングルスレッドコード間の壮大な違いに気づき始めます。たとえば、すべての反復でキャッシュミスを呼び出します。たとえば、関連するデータがキャッシュラインにロードされていない連続ブロックにアクセスする並行して実行されるベクトル化されたコード。

1
user204677

累積エネルギー使用

これらの議論に欠けていると私がいつも思っている答えが1つあります。少し気になるのは累積エネルギー使用量です。

確かに、高水準のインタプリタ言語でプログラムを作成し、ブラウザで2層の間接参照で実行させる場合や、ループに0.001秒ではなく0.01秒かかる場合は、問題にならないかもしれません。誰も気づかないでしょう、つまり個人ユーザーは気づかないでしょう。

しかし、何万人、場合によっては何百万人ものユーザーがコードを使用すると、余分な非効率性がさらに増大します。ツールによってCPUが1日にわずか10秒間だけスリープ状態になるのを防ぎ、100万人のユーザーがそれを使用する場合、非効率的なアルゴリズムが余分に140 kWhを使い果たした[1] 1日あたり。

私はこれが議論されることをめったに見ません、そしてそれは悲しいことだと思います。私は、Firefoxのような人気のあるフレームワークや、豪華なインタラクティブなWebアプリケーションでは、この数値がはるかに悪いと強く疑っています。調査することは興味深いでしょう。


[1]私はちょうどそれを作りました、1000万秒×50ワット。正確な数値は多くの事柄に依存します。

1
pipe

正直なところ、それはあなたの目的が何であるか、そしてあなたがプロとしてプログラミングしているか、趣味としてプログラミングしているかに依存します。

今日、現代のコンピュータは本当に強力なマシンです。どのような基本的な操作を行うかに関係なく、マイクロ最適化を試みているかどうかに関係なく、これらの操作により作業が著しく速くなります。しかし、もちろん、何か他のことをしている場合(たとえば、物理学や化学などの分野のスーパーコンピューティング)、必要なだけ最適化することをお勧めします。

初期のMITプログラマーは素晴らしいものを作るために生まれてきたわけではありません。彼らは既存のアルゴリズムを簡素化し、強化し始めました。彼らの誇りは、2 + 2を既存のアルゴリズムよりも2秒足らずにすることでした(それは彼らはパフォーマンスのためにTI-83マシンでより少ないパンチカードを常に使用しようとしました。

また、組み込みシステム向けにプログラミングしている場合は、マイクロパフォーマンスに注意する必要があります。別のデジタルクロックよりも5ナノ秒早く秒を刻む低速のデジタルクロックは必要ありません。

最後に、あなたが趣味のプログラマーであれば、たとえプログラムが高速であっても、細部を最適化しても害はありません。それは必要ではありませんが、確かにあなたが取り組むことができ、さらに学ぶ機会を持つことができる何かです。ソフトウェアで専門的に作業している場合、それが非常に必要でない限り、その贅沢を受け入れることはできません。

1
Andy Ibanez

100アイテムリストでO(N2)対O(NlogN)アルゴリズムを使用します。

私も最近似たような状況でした。たくさんのアイテムがありました。予想されるケースでは、リストに2つ(!)のアイテムがあり、最悪の場合でも、4つまたは8つを超えるとは予想していません。

そのリストをソートする必要がありました。結局、std::sortを並べ替えネットワーク(本質的にはネストされたifsの多く)に置き換えて、実行時間の大部分を削ぎ落としました(数値は覚えていませんが、10のようなものでした– 20%)。これはhugeマイクロ最適化の利点であり、コードは絶対にパフォーマンスが重要です。

もちろん、私はこれだけプロファイリングを行いました。しかし、要点は、C++と同じくらい不便で複雑​​な言語を使用する場合(過負荷を解決するための腹立たしく複雑なルールは言うまでもありません)、私は完全な利点を享受したいと思います。

1
Konrad Rudolph

私はそれについてあまり心配しなくてもいいくらい幸運でしたか、それとも私は悪いプログラマですか?

あなたの要件を気にしますか?パフォーマンスが要件でない場合は、心配する必要はありません。それにかなりの時間を費やすことはあなたの雇用主にとって害になります。

ある程度まで、パフォーマンスは常に要件です。それについて考えずにそれを打つことができれば、あなたはそれについて考えないことは正当化されます。

個人的には、テストに合格するまでに時間がかかる場合、パフォーマンスが原因である場合がほとんどです。一連のテストに合格するまで5分間待ちきれません。しかし、それは通常、テストをいじることによって解決されます。

私の質問は、なぜ多くのプログラマーがそんなに気にかけるのですか?ほとんどの開発者にとって本当に問題なのですか、

多くのプログラマーが、どれだけ気にかけているかを正当化しています。そうでない多数の人々がいます。そうでない人たちについて話しましょう。

プログラマーが学校で最初に学ぶことの1つは、物事を実際に機能させる方法の後に、大きなO表記法です。彼らの多くは、レッスンを適切に学び、したがってnによって劇的に影響を受けるものに適切に焦点を合わせます。他の人は数学を理解せず、一度動作したらすぐに高速にする必要があるという教訓だけを取り上げます。さらに悪いことに、これらの学生の何人かは、コードを機能させることと、それを高速に機能させること以外に、コードで何をすることが重要かについて他に何も学習しません。見逃された教訓:読みやすくし、上手に設計し、理由なく遊んではいけません。

クヌースは正しかった:時期尚早の最適化はすべての悪の根源です。しかし、いったん機能したら、次のステップは何ですか?速いでしょ?番号!次のステップは読みやすいです。読み取り可能は、最初、次、中間、最後のステップです。不要なパフォーマンスの最適化を行っていると私が思う人の多くは、バスの下で可読性をスローしています。

一部の人は、自分のコードがどれほど読みにくいかによって、ひどいスリルを得ます。彼らは、他の人が作成した理解しにくいコードを見ることに苦労しなければならなかったので、今は投資回収の番です。

私はこれをやっていたので、私はこれを知っています。私はかつて、完全に読み取り可能な5行の構造を解読できない1行のブール式にリファクタリングし、非常にコンパクトで威圧的なものを作成できるので、感心することを期待して教授に誇らしげに送りました。期待していた賞賛は得られませんでした。

コードが読みやすいままであれば、後で速くするのは簡単です。そのため、Knuthは「不要」ではなく「時期尚早」を強調しています。確かに、速いほど良いです。しかし、あなたがそれのために何を犠牲にするかに応じて、より良いのはより良いだけです。したがって、実際に必要なパフォーマンスがわかるまで、それを犠牲にする必要はありません。いったんなくなると読みやすさを犠牲にします。

可読性を超えるのは、ソフトウェア設計の全世界です。このサイトについて何人かは、デザインまで何をすべきか手がかりがありません。だから彼らはデザインに感銘を受けられないので、彼らは判読不能な混乱を作り、人々が彼らに手がかりがないことを伝えることができないようにします。誰も自分のコードを修正したことがないので、それは良いコードであるに違いありませんか?

一部の人にとって、パフォーマンスは、彼らがやりたいことをすべて行うためのすべての言い訳です。プログラマーには多くの力と自律性があります。彼らに信頼が置かれました。信頼を乱用しないでください。

0
candied_orange

あなたが述べたように、実際にこれらの問題によって引き起こされるいくつかの問題を説明する前に、マイクロパフォーマンスの問題に注意を払うことは無意味です

0
huubby

この質問に一般的に答えることは本当に不可能です。今日構築されているほとんどのソフトウェアは内部WebサイトとLOBアプリケーションであり、そのようなプログラミングの場合、推論は非常に正確です。一方、デバイスドライバーやゲームエンジンなどを作成している場合、最適化は「時期尚早」ではありません。ソフトウェアは、ハードウェアの制約が異なる非常に異なるシステムで実行される可能性があります。その場合は、パフォーマンスを考慮して設計し、次善のアルゴリズムを選択しないようにする必要があります。

0

パフォーマンスに非常に関心があるプログラマーの問題は、彼の人生の中で、時には非常に緊急にマイクロパフォーマンスのコードを書く必要があり、彼が学んだこと、学んだこと、学んだこと、そして結局彼が多くのものとトリック。

そして、今では忘れることは難しく、事前の測定がなければ、心配する必要がないことを示しています。彼は高速コードを使用して、安全な側にいます。

深い知識、スキル、およびいくつかのトリックを示し、学んだことを再利用することは常にいいことです。それはあなたが貴重であると感じ、時間は、それが価値があるので、学習に費やします。

時々私のライブでは、プレフィックスの増加が速いことを学びました...

for (int i = 0; i < MAX; ++i)

...後置インクリメントより:

for (int i = 0; i < MAX; i++)

これで、MAXが低い場合は問題にならず、ループ内に実際の作業がある場合も問題になりません。しかし、たとえ今日のコンパイラが独自にコードを最適化しても、postfixバージョンを使用する理由はありません。

たぶん、パフォーマンスを求める人は、「実用的で読みやすいコード」のような「実用的なコード」を書くだけでなく、オプションの大海原にガイドラインを設けるための追加の目標が必要です。

0
user unknown