組み込み型の性能:char vs. short vs. int vs. float vs. double
質問
これは少し愚かな質問のように見えるかもしれませんが、Alexandre Cの 返信 を見て、組み込み型とのパフォーマンスの違いがあるのかどうか知りたくなりました。
char
対short
対int
対float
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 ではこれらの命令が省略されることになります。
低需要で高複雑な演算は、一般にほぼすべてのプロセッサーで遅くなります。
低需要で低複雑な操作は、誰かがそれについて考えるのを煩わせれば速くなり、そうでなければ存在しなくなります。
さらに読む。
- Agner Fog は素晴らしい ウェブサイト を運営しており、低レベルのパフォーマンスの詳細について多くの議論を行っています (そして、それを裏付ける非常に科学的なデータ収集方法を持っています)。
- インテル® 64 および IA-32 アーキテクチャー最適化リファレンス・マニュアル (PDF のダウンロード リンクはページの下の方にあります) は、特定のアーキテクチャーのファミリーに焦点を当てていますが、これらの問題の多くもカバーしています。
関連
-
[解決済み】致命的なエラー LNK1169: ゲームプログラミングで1つ以上の多重定義されたシンボルが発見された
-
[解決済み] error: 'if' の前に unqualified-id を期待した。
-
[解決済み】IntelliSense:オブジェクトに、メンバー関数と互換性のない型修飾子がある
-
[解決済み】C++の余分な資格エラー
-
[解決済み】クラステンプレートの使用にはテンプレート引数リストが必要です
-
[解決済み] int argc, char *argv[] とはどういう意味ですか?
-
[解決済み] floatとdoubleの違いは何ですか?
-
[解決済み] C++でdouble(またはfloat)がNaNかどうか確認する
-
[解決済み】"as "とnullable型によるパフォーマンスの驚き
-
[解決済み] Javaで整数のlog base 2を計算する方法は?
最新
-
nginxです。[emerg] 0.0.0.0:80 への bind() に失敗しました (98: アドレスは既に使用中です)
-
htmlページでギリシャ文字を使うには
-
ピュアhtml+cssでの要素読み込み効果
-
純粋なhtml + cssで五輪を実現するサンプルコード
-
ナビゲーションバー・ドロップダウンメニューのHTML+CSSサンプルコード
-
タイピング効果を実現するピュアhtml+css
-
htmlの選択ボックスのプレースホルダー作成に関する質問
-
html css3 伸縮しない 画像表示効果
-
トップナビゲーションバーメニュー作成用HTML+CSS
-
html+css 実装 サイバーパンク風ボタン
おすすめ
-
[解決済み】C++でユーザー入力を待つ【重複あり
-
[解決済み] string does not name a type Errorが発生するのはなぜですか?
-
[解決済み】「corrupted size vs. prev_size」glibc エラーを理解する。
-
[解決済み】C++の変数はイニシャライザーを持っているが、不完全な型?
-
[解決済み】fpermissiveフラグは何をするのですか?
-
[解決済み】Visual C++で "Debug Assertion failed "の原因となる行を見つける。
-
[解決済み】ファイルから整数を読み込んで配列に格納する C++ 【クローズド
-
[解決済み] [Solved] インクルードファイルが開けません。'stdio.h' - Visual Studio Community 2017 - C++ Error
-
[解決済み】指定範囲内の乱数で配列を埋める(C++)
-
[解決済み】1つ以上の多重定義されたシンボルが見つかる