0

調べてみましたが、探していた答えが見つからなかったので、ここでこの問題に対処することにしました。例を使用して説明する方がよいと思いますので、次のコード スニペットを検討してください。

int delta = 0;
if (some_condition)
    delta = 42;

x1 = regular_value1 + delta;
x2 = regular_value2 + delta;
// ...
// where delta is used a lot of times
// basically - if (some_condition == true) => add delta to all variables
// if FALSE - add 0 (thus, effectively not changing anything)

int delta = 42;

if (some_condition)
{
    x1 = regular_value1 + delta;
    x2 = regular_value2 + delta;
    // ...
}
else
{
    x1 = regular_value1;
    x2 = regular_value2;
    // ...
}

たとえば、非常に単純な実際のシナリオは次のようになります。たとえば、左側に画像が含まれる場合と含まれない場合がある Windows フォームを作成しているとします。画像がない場合 - 残りのすべてのフォーム コントロールを左側に作成し、画像がある場合は、他のすべてのコントロールを画像の右側に移動します (すべてのコントロールの X 位置にデルタを追加します)。

私はC#XNAゲームをプログラミングしています(したがって、パフォーマンスは多少関連しますが、OOPの原則は決して省略すべきではありません)。したがって、私の質問は、「some_condition」が50%のTRUEである場合、どのコードがより速く実行されるかです. ? 同様に、どのコードブロックが保守/読み取りが容易ですか?

これが大きな問題ではないことは承知していますが、可能な限り「最高の」コードを書く習慣をつけようとしているだけです。ご意見や個人的な経験をいただければ幸いです。

ありがとう。

4

4 に答える 4

1

これは確かに些細なケースであり、実際には両方が同じコードに最適化される可能性があります。最も理解しやすい方を使用することをお勧めします。これは、ここで示したよりも多くのプログラムに基づいて決定する必要があります。

ただし、特に「デルタ」が定数に変換される場合は、2 番目のソリューションの方が高速になる傾向があります。「some_condition」が false の場合、追加を行う必要はなく、オプティマイザーは実際の割り当てを高速化する方法を考え出すことができる可能性があるため、パフォーマンスの優位性が見られます。保守性を損なわないのであれば、できるだけ速いコードを書くのが最善だと思います。これよりもはるかに大きなパフォーマンスの差があるものであっても、後で速度を上げる方法を探して戻ってくることは現実的にありません。今すぐパフォーマンスのためにコーディングして、それを忘れることもできます。時間をかけてこれを維持すると、コードが無料でより速く実行されます。

いつの日か、プロファイリングによって、このコードがプログラムの最も遅いポイントとして指摘されるかもしれません。しかし、ほとんどの場合、あなたも他の人も、コードが特定の速度で実行されるという事実を受け入れ、それに応じて使用するでしょう。ユーザーを煩わせることなく、高速化して新しい場所 (キーストローク間など) で使用できるという事実は、決して考えられることはありません。

ここでのパフォーマンスの違いはわずかであり、とにかく速度が重要な条件でコードが使用されることはおそらくないでしょうが、速度のためにコーディングすることは良い考えだと思います. 習慣になれば、実際にはそれほど時間はかかりません。コードはすでに微調整されており、それを実行しているため、微調整した場合にコードで何ができるかがわかります。

(私の経験では、高速なコードと読みやすいコードはほとんど同じものです。人間がコードを簡単に理解できるなら、オプティマイザーも理解できます。最近ではオプティマイザーが王様です。すべてがコードの高速さに依存することを知っていない限り、スピードよりも明快さを求めてください。

于 2012-03-29T20:57:17.313 に答える
1

後者の方がわずかに速いか、両方が同じように最適化されている可能性があります。それは問題ではありません。問題が発生した場合は、後でいつでも変更できます (この特定のケースでは問題はありません。これは単なる一般的なアドバイスです)。しかし、少なくとも前者の方が読みやすく、維持しやすいと思います。regular_value1またはを変更したい場合はregular_value2、2 か所ではなく 1 か所だけ変更する必要があります。そのために行きます。

于 2012-03-29T18:39:01.497 に答える
0

@minitech が指摘したように、2 番目のアプローチは保守性に問題を引き起こす可能性があり、確実に問題を引き起こします (熟考するポイント: アプリケーションのライフサイクルはどのくらいですか? あなたが書いているコードは他の人によって再利用または消費されるのでしょうか?)。読みやすさ。これらの要素を既に検討したことを考えると、アプリケーションが準拠すべきいくつかのパフォーマンス数値を決定して設定することをお勧めします。

パフォーマンス要件が明確に確立されたら、どのアプローチに従うかを決定できます。OOP の原則と可読性はすべてのプログラマーの夢ですが、アプリケーションを顧客に出荷した後は、どのアプローチに従っていたかは関係ありません。重要なのは、アプリケーションが期待どおりに実行されることだけです (両方の観点から)機能とパフォーマンス)。

「最良の」コードを書くことの意味と、「最良の」コードが引き起こす可能性のある実際のパフォーマンスへの影響について、利害関係者と一緒に評価する必要があります。

于 2012-03-30T13:51:28.383 に答える
0

これは少し主観的な質問ですが、可読性 (および重要な保守性) に影響を与えることの 1 つは、コードが繰り返される量です。この場合、最初のオプションは、維持して読み取るコードが少なくなり (冗長性が少なくなります)、私の推奨する方法です。

于 2012-03-29T18:40:19.460 に答える