-3

みなさんも楽しんで読んでいただければ幸いです。

以下に2つのIFステートメントがあります

public int GetTax(Item item)
{
   int tax=0;
   if(item.Name.Equals("Book"))
   {
      tax = 10;
   }
   if(item.Imported)
   {
      tax += 5;
   }
   return tax;
}

上記のif条件をこれに変換しました。

public int GetTax(Item item)
{
     return 5 * ((int)item.Name.Equals("Book") * 2 + ((int)item.Imported));
}

どちらが効率的だと思いますか?なぜ正当化するのですか?

4

1 に答える 1

1

文字通りコンパイルすると、分岐がないため、2番目の方法の方が効率的です。

分岐があるときはいつでも、いくつかの分岐予測があり、それが見落とされる可能性があるため、CPUがマシン命令を再実行する原因になります。

そうは言っても、コンパイラーによっては、あなたが書いたものは、同等のコードに最適化するのに十分単純な場合があります。これは、呼び出すもののリターンタイプによって異なります。戻り型がブール値の場合、それらは同等です。

ただし、たとえば、item.Imported実際に整数型の場合、指定した2つの例は同等ではなく、コンパイラーは両方を同じものにコンパイルしない可能性があります。

最適化はコンパイラに大きく依存するためです。実行時間を最小限に抑えることが重要である場合は、コードのベンチマークを行うかどうかしかわかりません。

于 2012-09-04T09:41:32.673 に答える