7

64 ビット OS を対象とする場合、いつ 64 ビット整数を使用するかについて疑問があります。

生成されたコードの速度に焦点を当てた決定的な研究を行った人はいますか?

  • 関数またはメソッドのパラメーターとして 64 ビット整数を使用する方が良いですか? (例: uint64 myFunc(uint64 myVar)) 64 ビットの整数をパラメーターとして使用すると、より多くのメモリが必要になりますが、おそらくより効率的になります。たとえば、ある値が常に 10 より小さくなければならないことがわかっている場合はどうでしょうか。このパラメーターには 64 ビット整数を引き続き使用しますか?

  • 戻り値の型として 64 ビット整数を使用する方が良いですか? 戻り値として 32 ビットを使用すると何らかのペナルティがありますか?

  • ループには 64 ビット整数を使用する方が良いですか? (for(size_t i=0; i<...)) この場合だと思います。ループに 32 ビット変数を使用すると何らかのペナルティがありますか?

  • ポインターのインデックスとして 64 ビット整数を使用する方が良いですか? (例: myMemory[index]) この場合、私はそれを推測します。インデックスに 32 ビット変数を使用すると何らかのペナルティがありますか?

  • クラスまたは構造体にデータを格納するには、64 ビット整数を使用する方が良いですか? (ディスクなどに保存したくない)

  • bool型は64ビットにした方がいいの?

  • 64 ビット整数と浮動小数点の間の変換はどうですか? 今は double を使用したほうがよいでしょうか? これまで、double は float よりも低速でした。

  • 32 ビット変数にアクセスするたびに何らかのペナルティがありますか?

よろしく!

4

3 に答える 3

4

@MarkB に同意しますが、いくつかのトピックについて詳しく説明したいと思います。

x64 では、より多くのレジスタを使用できます (2 倍)。そのため、標準の呼び出し規約は、デフォルトでより多くのパラメーターをレジスターで受け取るように設計されています。そのため、パラメーターの数が多すぎない限り (通常は 4 つ以下)、それらの型に違いはありません。 いずれにせよ、それらは 64 ビットに昇格され、レジスタに渡されます。

これらの 64 ビット レジスタは、レジスタで渡されますが、スタック上にスペースが割り当てられます。これは、それらの格納場所を単純にし、余剰パラメータの格納場所と連続させるための設計によるものです。余剰パラメータは関係なくスタックに配置されるため、そのような場合はサイズが重要になる場合があります。

この問題は、メモリ データ構造で特に重要です。32 ビットで十分なところに 64 ビットを使用すると、メモリが浪費され、さらに重要なことに、キャッシュ ラインのスペースが占有されます。ただし、キャッシュへの影響は単純ではありません。 データ アクセス パターンがシーケンシャルである場合は、基本的にキャッシュの半分を使用できなくすることで代償を払うことになります。(各 64 ビット量の半分だけが必要であると仮定します。)

アクセス パターンがランダムである場合、キャッシュのパフォーマンスに影響はありません。これは、いずれにせよすべてのアクセスが完全なキャッシュ ラインを占有するためです。

ワード サイズより小さい整数へのアクセスには、わずかな影響が生じる可能性があります。ただし、パイプライン化と命令の複数発行により、余分な命令 (ゼロまたは符号拡張) がほぼ常に完全に隠され、監視されなくなります。

このすべての結論は単純です。問題に重要な整数サイズを選択してください。 パラメーターの場合、コンパイラーは必要に応じてそれらをプロモートできます。メモリ構造の場合、通常は小さいほど優れています。

于 2012-12-04T17:11:22.020 に答える
3

ここでは、大量の質問を 1 つの質問に詰め込むことができました。あなたの質問はすべて、基本的にマイクロ最適化に関係しているように見えます。そのため、私は 2 つの部分からなる回答を作成します。

  • パフォーマンスの観点からサイズについて心配する必要はありませんが、代わりに、含まれるデータを示す型を使用し、コンパイラのオプティマイザーがそれを分類することを信頼してください。

  • 開発中のある時点でパフォーマンスが問題になる場合は、コードをプロファイリングします。次に、必要に応じてアルゴリズムを調整し、整数演算が問題を引き起こしていることをプロファイラーが示している場合は、比較のためにさまざまなサイズを並べて比較できます。

于 2012-12-04T15:56:52.850 に答える
0

intプラットフォームとコンパイラの作成者が自分の仕事をやり遂げ、最も効率的な表現を選択したことを信頼して使用してください。ほとんどの 64 ビット プラットフォームでは 32 ビットです。つまり、64 ビット型よりも効率的です。

于 2012-12-05T06:54:18.240 に答える