1

Q1. CPU を消費せずに優れたパフォーマンスを達成するコードを作成するためのベスト プラクティスは何ですか? 質問は非常に一般的です。ここで私が求めているのは、さまざまな環境で使用されるさまざまなプラクティスをリストアップすることですか? プロセスモニター/タスクマネージャー以外のデバッグのヒント

編集:私はIOバウンドプロセスについて話しているのではありません。私はCPUバウンドプロセスについて話しています。しかし、ここでは、プロセスが CPU を占有し続けることは望ましくありません。4 コアのマシンがあり、プロセス内で 4 つの単純なループを実行すると、アプリケーション/プロセスが実行されるまで CPU 消費が最大 400% まで上昇します。

私はここで、誰もが何度か直面したであろうトピックについての経験を求めています. たとえば、アプリケーションが存在しないファイルを検索するために継続的にループしていたため、Windows で CPU を占有していたアプリケーションをデバッグしました。

2 つの異なる CPU バウンド アプリケーションがスムーズに実行される (良い応答が得られる) ようにプログラムを作成するにはどうすればよいですか?

更新: 提案:

  1. 適切でクリーンなコードを記述し、アプリケーションをプロファイリングしてから最適化します。(ヒントをありがとうテッド)

  2. コードをプロファイリングして修正するよりも、コードを書き直し/再設計/リファクタリングする方が簡単です。

  3. プロファイラーを使用してアプリケーションをデバッグする

  4. 待機時間が長いスレッドにはスピンロックを使用しないでください

  5. アルゴリズムの選択

これらの提案は、初心者が概念を理解するのに大いに役立ちます。

4

9 に答える 9

6

まず、きれいなコードを書きます。可能な限り簡単な方法で物事を行います。その後、プログラムの速度に満足するまで、次の操作を繰り返します。

  1. その実行をプロファイリングします。
  2. 最も多くの時間を費やしている部分を見つけます。
  3. それらの部分を高速化します。

最適化の名目でコードを前もって改変するという罠にはまらないでください。

アムダルの法則を思い出してください。プログラムの時間の 1% しか消費していないものを高速化しても、目立った改善は得られません。プログラムが最も多くの時間を費やしている部分を高速化することで、最適化の費用を最大限に活用できます。

于 2009-05-22T14:24:06.487 に答える
6
  • プロファイラーを宗教的に使用します。ボトルネックを探すときは、常識に頼らないでください。
  • big-O 記法を学び、一般的なアルゴリズムの big-O を覚えておいてください。
  • ビジー状態の待機ループは絶対に避けてください。
  • 組み込みの場合は、コードをコード キャッシュに適合させる方法を学びます。これにより、タイトなループで 10 倍のスピードアップを実現できる場合があります。
  • 高レベルの階層化された開発を行う場合は、データを効率的にキャッシュする方法を学びます (たとえば、DB ステートメントの数を最小限に抑えるため)。
于 2009-05-22T13:38:32.007 に答える
5

できるだけ少ない作業を行います。


元の質問を編集したので、あなたが説明した特定の状況に対処するために、ここにいくつかの考えを追加します。

プロセスがブロックされている場所がわからない場合 (デバッグのヒントを求めていたため)、デバッガーを一時停止するだけで開始できます。これにより、実行中のアプリケーションが停止し、そこからすべての現在の場所を調査できます。スレッドを調べて、それらのいずれかがタイトなループにあるかどうかを確認します。

次に、適切なプロファイラーであれば、このような状況を簡単に把握できます。プロファイラーをアタッチし、ブロックされたポイントにアプリケーションを実行して、合計ランタイムの割合が大幅に増加している呼び出しを確認します。そこから戻ってブロッキング ループを見つけることができます。

問題を特定したら、理想的にはアルゴリズムを再考して、状況を完全に回避します。これが不可能な場合は、スレッドにスリープ コマンドを導入します。これにより、他のスレッドが CPU を使用できるようになり、アプリケーションと OS 全体の応答性が向上しますが、操作の実行時間が長くなります。マルチコア プログラミングの秘訣は、すべてのスレッドがパフォーマンスと他の待機中のタスクへの配慮との間で妥協するようにすることです。

対象となる特定の言語またはオペレーティング システムを知らなければ、問題に対するデバッガーとプロファイラーの組み合わせについてアドバイスすることはできませんが、ほとんどの成熟した言語には適切な解決策があると思います。

于 2009-05-22T13:41:39.753 に答える
2

純粋にCPU使用率が向上する場合は、big-O表記が必要です。可能な限り少ない計算でアルゴリズムを機能させる方法を考え出す必要があります。

ただし、一般的なパフォーマンスに関しては、CPU 使用率がボトルネックの少ないものの 1 つだと思います。

パフォーマンスに関してさらに重要なことは、次のとおりです。

データ バインディング。すべてのデータを前もって取得するか、必要に応じて取得するか。これらの方法のいずれかを選択することが、アプリのパフォーマンスの鍵となる場合があります。

作業中のデータを削減できますか? すべてを簡単にメモリに収めることができれば、ここでパフォーマンスを向上させることができます。余談ですが、メモリに入れすぎると逆効果になる可能性があります。

要約すると、パフォーマンスに対する一般的な解決策はありません。コードを (いくらか知性を持って) 書いてから、苦労している場所を調べてください。

于 2009-05-22T13:43:44.570 に答える
1

CPU を最も効率的に使用する方法を探しているのか、それとも CPU を集中的に使用する作業がたくさんあるときにマシンの停止を回避する方法を探しているのか、私にはよくわかりません。

これらは互換性がありません。

前者の場合、理想的には、好きなだけCPUを完全に引き継ぐことができるOSが必要です。そのため、OS自体でCPUサイクルを無駄にする必要はなく、他のプロセスは言うまでもありませんそれが実行されている可能性があります。

後者については、最近、設計が不十分なCPU バウンド アルゴリズムを使用するコードを書いていましたが、新しい Intel I7 プロセッサは私の救世主です。それぞれが 2 つのスレッドを実行できる 4 つのコアを考えると、OS スレッドの使用をアプリケーションごとに 5 つまたは 6 つに制限しようとするだけで、別のウィンドウに切り替えてkillコマンドを実行するために使用できる CPU がまだ残っています。少なくとも、システムをスペースリークのあるスワップに追いやるまでは。

于 2009-05-22T14:51:55.260 に答える
1
  • 遅延値やその他の種類のキャッシュを使用する
  • 慎重にアルゴリズムを選択してください
于 2009-05-22T13:38:03.723 に答える
1
  • コード最適化手法に従ってください。

  • 操作のメモリを計算します。

  • 各操作の時間を計算します。
    (ビッグオ表記)

于 2009-05-22T13:38:48.603 に答える
0

ここで良い提案。コードを簡単に書くほど、時間を節約できます。

私はパフォーマンス チューニングをデバッグの延長として考えています。人々は測る、測る、測ると言いますが、私は違います。必要に応じて何回も予告なしに立ち寄って、プログラムに問題が何であるかを正確に教えてもらいました。それはたいてい驚きであり、決して間違いではありません。

これの通常の歴史は、プログラムの大きさにもよりますが、一連のパフォーマンスの問題を見つけて修正することであり、それぞれが 10% から 50% のスピードアップをもたらします (悪い問題がある場合はそれ以上)。これにより、全体の速度がおそらく 10 倍向上します。

次に、サンプルはそれが何をしているかを正確に教えてくれますが、基本的な再設計なしにそれを修正する方法を考えることはできません。と。

再設計を行うことができれば、パフォーマンスの検索と修正をさらに数回行うことができます。この後、収穫逓減のポイントに到達すると、それが物理的に可能な限り高速であることがわかり、アセンブリレベルでシングルステップを実行し、すべての命令が答えに到達するまでに「重みを引っ張る」のを見ることができます。

そこにたどり着くのは本当にやりがいがあります。

于 2009-05-22T15:52:21.817 に答える