2016-05-22 5 views
1

アルゴリズムを実装すると、できるだけコストの低い操作を使用しようとします。C#の基本操作のコストはいくらですか?

私はC#で基本的な操作は、次のように(速度やコストの面で)順序付けられているかどうかを知りたいのです:

  • 比較
  • を(U)int型、加算、減算、bitops、シフト
  • 点の追加、サブ(別々のユニット!)
  • インデックス配列アクセスフローティング(警告:キャッシュの効果)
  • (U)INT32 MUL
  • FP MUL
  • FP除算、剰余
  • (U)INT除算、剰余
+2

https://msdn.microsoft.com/en-us/library/ms973852.aspx – Nasreddine

+0

このすべては、最適化の目的にはあまり関係ありません。整数の生の比較は、FP番号の生の分割よりもずっと安いかもしれませんが、FPの数がCPUのキャッシュにあり、整数がそうでない場合、分割は比較よりもはるかに時間がかかります(速いのは、あなたが取得するために街中を運転しなければならない2つの数字を比較するか?) – dasblinkenlight

+1

あなたの質問は、C#以外の高級言語を使用している場合でも、どのCPU操作が安価かを既に知っていることを意味します。それが本当であれば、あなたが既に知っていることは、C#を使っているときにも当てはまります。 –

答えて

1

すでにBranko Dimitrijevicが指摘しているように、C#は実行されず、ILにコンパイルされます。そのILも実行されず、マシンコードにコンパイルされます。だから私はあなたの質問を"私のCPUで低レベルの操作が安いと再解釈する以外に選択肢はありませんか?"。話すアーキテクチャがたくさんあり、あなたが興味を持っているアーキテクチャが特定されていないので、デスクトップシステムでは最も一般的なので、x86とする予定です。

お問い合わせの情報は、Intel Architectures Optimization Reference Manualの付録Cに記載されています。さまざまな手順のレイテンシとスループットがリストされています。レイテンシは、ある命令の結果が後続の命令によって使用可能になるまでに要するサイクル数です。スループットは、命令がその実行ユニットを停止させるサイクル数である。いくつかの例:

  • cmpaddsubandorxorは、1のレイテンシと0.25のスループットを持っています。
  • およびrolは、データがどこにあるかに依存して、レイテンシが1から2であり、スループットが0.5から1.5です。
  • imulのレイテンシは3であり、64ビットレジスタを読み取るときのスループットは1ですが、レイテンシは4〜5であり、32ビットレジスタを読み取るときのスループットは1です。
  • idivは、計算そのものに応じて変化するレイテンシとスループットを持っています。
  • だから、

、私が(コストの低い順に)、あなたの提案のリストをあなたが尋ねたすべて操作を見上げていないものの、少なくとも合理的なようです。


これは基本的な操作のコストに関するもので、それ以上のことは想定していません。しかし、実際のプログラムを実際にマイクロ最適化したい場合、事態は全く異なります。

タイミングテーブルが入る前に、同じアーキテクチャで実行されるプログラムのパフォーマンスに重要な役割を果たしている多数の要因を説明しているが600ページ以上あることに注目してください。これには、アウトオブオーダー実行エンジン、キャッシュレベル、パイプライン、分岐予測、どのユニットがどの命令を実行するかなどが含まれます。

これらのすべての問題に関する実践的な知識を身につけることができないと思われる場合は、そのレベルでマイクロ最適化を試みることに多くのポイントがあるとは思われません。あなたは盲目的にそれをやるでしょう。

+0

ありがとう、偉大な答え! –

5

NO "C#の動作は、" 今までに実行されていない - それが依存するマシンコードへ(MSIL、次いでJITコンパイルされたに)コンパイルされますターゲットアーキテクチャそのため、たとえ1つの操作が1つのアーキテクチャで他の操作よりも速い場合でも、その逆は他のアーキテクチャでも当てはまる可能性があります。

あなたが求めているのはとにかく低レベルです。データ構造とアルゴリズムの選択肢はさらに大きなインパクトをもたらしますが、それを打ち破っても、memory latenciesは個々の操作を支配する可能性があります。

関連する問題