何が速いか:(パフォーマンス)
__int64 x,y;
x=y;
また
int x,y,a,b;
x=a;
y=b;
?
またはそれらは等しいですか?
__int64
は非標準のコンパイラ拡張であるため、高速である場合とそうでない場合がありますが、クロスプラットフォームコードが必要な場合は使用しないでください。代わりに、使用や使用などを検討する必要が#include <cstdint>
あります。これらは、固定幅の整数演算uint64_t
を提供するC99標準から派生しています。stdint.h
inttypes.h
パフォーマンスに関しては、使用しているシステムによって異なります。たとえば、命令は32ビットまたは64ビットのレジスタを処理できるx86_64
ため、32ビットと64ビットの整数を追加してもパフォーマンスに違いは見られません。add
ただし、32ビットプラットフォームでコードを実行している場合、または32ビットアーキテクチャ用にコンパイルしている場合、64ビット整数を追加するには、実際には1つではなく2つの32ビットレジスタを追加する必要があります。したがって、余分なスペースが必要ない場合は、それを割り当てるのは無駄になります。
コンパイラーが必要に応じて型をより小さなサイズに最適化できるかどうか、または実際に最適化できるかどうかはわかりません。私はそうは思わないが、私はコンパイラエンジニアではない。
私はこの種の質問が嫌いです。
1)自分で測定する方法がわからない場合は、ほぼ確実に答えを知る必要はありません。
2)最近のプロセッサでは、単一の命令に基づいて何かがどれだけ速くなるかを予測することは非常に困難です。割り当てを使用するコードのばかげた小さなスニペットを最適化することを心配するよりも、プログラムのキャッシュ使用量と全体的なパフォーマンスを理解することがはるかに重要です。コンパイラにそれを心配させ、使用するアルゴリズムや、はるかに大きな影響を与えるその他のことを改善するために時間を費やしてください。
要するに、あなたはおそらく言うことができず、それはおそらく問題ではありません。それはばかげた質問です。
コンパイラのオプティマイザは、例のすべてのコードを削除するため、違いはありません。一度に32ビットまたは64ビットずつデータを移動する方が速いかどうかを知りたいと思います。データが8バイトにアラインされ、64ビットマシンを使用している場合は、一度に8バイトでデータを移動する方が高速です。ただし、これにはいくつかの注意点があります。コンパイラがすでにこの最適化を行っていることに気付くかもしれません(確実に発行されたアセンブリコードを確認する必要があります)。その場合、違いはわかりません。また、大量のデータを移動する場合は、独自にローリングする代わりにmemcpyを使用することを検討してください。より高速にコピーしたり、他の操作をより高速に(つまり、命令数の半分で)実行するために、32ビットintの配列を64ビットにキャストすることを検討している場合は、必ずGoogleに問い合わせてください。厳密なエイリアシングルール。
__int64はほとんどのプラットフォームで高速であるはずですが、注意が必要です。一部のアーキテクチャでは、これを有効にするために8に調整する必要があり、調整しないとアプリがクラッシュすることもあります。