1. ホーム
  2. c++

組み込み型の性能:char vs. short vs. int vs. float vs. double

2023-09-18 08:07:13

質問

これは少し愚かな質問のように見えるかもしれませんが、Alexandre Cの 返信 を見て、組み込み型とのパフォーマンスの違いがあるのかどうか知りたくなりました。

charshortintfloat vs. double .

通常、私たちは実際のプロジェクトでこのような性能差(もしあれば)を考慮しませんが、教育目的でこれを知りたいと思います。一般的な質問としては

  • 積分演算と浮動小数点演算の間に性能差はありますか?

  • どちらが速いのでしょうか?速くなった理由は何ですか?説明してください。

どのように解決するのですか?

フロートと整数の比較。

歴史的に、浮動小数点は整数演算よりもはるかに遅くなることがありました。 現代のコンピューターでは、これはもはや事実ではありません (一部のプラットフォームでは多少遅くなりますが、完璧なコードを書いてすべてのサイクルに対して最適化しない限り、その差はコードの他の非効率性に押し流されます)。

ハイエンドの携帯電話のようなある程度制限されたプロセッサでは、浮動小数点は整数より多少遅くなるかもしれませんが、ハードウェア浮動小数点が利用可能である限り、一般に 1 桁以内 (またはそれ以上) です。 携帯電話がより多くの一般的なコンピューティング ワークロードを実行するよう求められるにつれ、このギャップが急速に縮まっていることは注目に値します。

また 非常に 限られたプロセッサ (安価な携帯電話やトースター) では、一般に浮動小数点ハードウェアが存在しないため、浮動小数点演算はソフトウェアでエミュレートする必要があります。 これは遅いです。整数演算よりも 2 桁ほど遅いのです。

しかし、私が述べたように、人々は携帯電話やその他のデバイスがますます本物のコンピューターのように動作することを期待しており、ハードウェア設計者はその需要に応えるために FPU を急速に強化しています。 最後の 1 サイクルまで追い求めるか、浮動小数点をほとんどあるいはまったくサポートしない非常に限られた CPU 用にコードを書いているのでなければ、パフォーマンスの違いは重要ではありません。

異なるサイズの整数型。

異なるサイズの整数型

典型的なのは CPU は、本来のワード サイズの整数を操作するのが最も高速です (ただし、64 ビット システムについてはいくつかの注意事項があります)。 最近の CPU では、32 ビット演算は 8 ビットや16 ビット演算よりも高速であることが多いですが、これはアーキテクチャによってかなり差があります。 また、CPUの速度は単独で考えることはできず、複雑なシステムの一部であることを覚えておいてください。 16ビット数での演算が32ビット数での演算の2倍遅いとしても、32ビットではなく16ビット数で表現すると、2倍のデータをキャッシュの階層に収めることができるのです。 それが、頻繁にキャッシュミスをする代わりに、すべてのデータがキャッシュから得られるという違いであれば、メモリアクセスの高速化は、CPUの動作の遅さを切り捨てることになります。

その他の注意事項。

ベクター化は、より狭い型に有利になるよう、バランスをさらに傾けます ( float や 8 ビットや 16 ビットの整数型) に有利になります。 しかし、良いベクトルコードを書くのは難しいので、多くの慎重な作業なしにこの利点を得られるとは思えません。

なぜ性能に差があるのでしょうか。

CPU上で演算が速いかどうかに影響する要因は、演算の回路の複雑さと、演算を速くしたいというユーザーの要求の2つだけです。

(チップ設計者がその問題に十分なトランジスタを投入しようと思えば、(理由の範囲内で)どんな演算も高速にすることができます。 しかし、トランジスタにはコストがかかります (むしろ、トランジスタをたくさん使用するとチップが大きくなるため、ウェハーあたりのチップ数が減り、歩留まりが低下し、コストがかかります)。したがって、チップ設計者は、どの演算にどれだけの複雑さを使用するかバランスをとる必要があり、(認識された) ユーザー需要に基づいてこれを実行します。 大まかには、演算を4つのカテゴリーに分類して考えることができます。

                 high demand            low demand
high complexity  FP add, multiply       division
low complexity   integer add            popcount, hcf
                 boolean ops, shifts

需要の高い、複雑度の低い操作は、ほぼすべての CPU で高速になります。これは、ぶら下がる果実であり、トランジスタあたりのユーザーの利益を最大化します。

高需要、高複雑度の演算は、高価な CPU (コンピュータで使用されるようなもの) で高速に処理されます。 しかし、高速な FP 乗算を搭載したトースターに 3 ドルを追加で支払う気はないでしょうから、安価な CPU ではこれらの命令が省略されることになります。

低需要で高複雑な演算は、一般にほぼすべてのプロセッサーで遅くなります。

低需要で低複雑な操作は、誰かがそれについて考えるのを煩わせれば速くなり、そうでなければ存在しなくなります。

さらに読む。