2017-01-04 16 views
1

分数をキャンセルする2つの数値のhcfを計算する簡単なループがあります。while文内の三項式をループごとに評価する

while条件内の三項式がすべてのループで再計算されていて、その前に一度だけ計算し、パフォーマンス目的の変数として保存する必要があるのだろうか?

public Fraction LowestForm() 
     { 
      int hcf = 1; 
      int counter =2; 
      while (counter <= (Numerator < Denominator ? Numerator : Denominator)) 
      { 
       if (Numerator % counter == 0 && Denominator % counter == 0) 
       { 
        hcf = counter; 
       } 
       counter++; 
      } 
      return new Fraction(Numerator/hcf, Denominator/hcf); 
     } 

は明確にする:私はRosylynコンパイラで主に心配

+0

コンパイラがそのジッタを最適化しないとしても(私は思うが) –

+1

C#のコンパイラは1つしかないのですか?そうでない場合、この質問に対する答えはどのコンパイラが使用されているかに依存しませんか?ちょうどそれを言及するために傷つくことはありません。 – Rainbolt

+0

@Rainbolt動作は言語仕様で定義されており、言語の任意のコンパイラはC#コンパイラと見なされるためにはそれを尊重する義務があります。 – Servy

答えて

2

実際はこれによって異なります。任意の式(または任意の部分式、部分式の特定の型は重要ではなく、部分式の位置、つまりループの状態またはループの本体の内部が重要でない場合)は、ループをループから外して一度だけ計算すると、オプティマイザはこれを行います。 C#はかなり良いオプティマイザを持っています。

デバッグビルドでは、何も最適化されません。すべての式が再計算されます。

まず、コードの明瞭さと可読性を高めることをお勧めします。それ以外の作業コードを開発する時間を最小限に抑えるようにしてください。重要なコードでのみオプティマイザを助ける必要があります。あるいは、何らかの理由でオプティマイザがうまくやっていないことがわかったときに役立ちます。まれに、時にはこれが起こります。

+0

オプティマイザに頼るよりも、これを自分で行うのが良い方法ですか? また、カウンタインクリメンタを追加しました。良い点! –

+1

@JamesHughesはオプティマイザを利用していますか?あなたはこのすべてを1行に収めることから何の利益を得ますか?ローカル変数を定義した方が読みやすくなります。あなたが定義している余分な変数については心配しないでください。どのボディも傷つけることはありません –

+1

@ M.kazemAkhgaryループの内部に変数を定義することができるので、James Hughesのコメントに関する質問には触れません。私の意見では、変数をループの外に宣言すると、値が一度だけ計算され、コードが読みやすくなります。 – Rainbolt

2

完了したときにはい、どのように他のwhile文は知っているだろうか?ループを終了できるかどうかを知るためには、反復ごとに式全体を再評価する必要があります。

つまり、CILを作成すると、ループから最適化される可能性が高くなります。

+0

技術的に答えは**間違っています**。 OPは明示的に三項表現の部分であり、表現全体についてではない。 –

+0

@KirillKobelevそういう論理で、もしあなたが私のガレージを塗り直すのを雇うが、家全体を塗り替えたら、ガレージが塗り替えられたかどうか聞いたら、あなたは「はい」と言っても間違いだろうか? –

+0

ロジックが機能しません。 OPのタイトルは変更されていません。そして、部分式について直接質問します。 –