• ベストアンサー

C言語の型による処理速度の違い

short int型よりint型。float型よりdouble型の方が 扱えるサイズは広いにも関わらず処理速度が速いと 聞いたのですが、それは本当でしょうか? もしそうならなぜそうなるのでしょう? (一度BCCでfloatとdoubleの処理速度を計ったらfloatの 方が少し早かったですが・・) 高速なプログラムを書く必要の出たときのために型に よる処理速度を教えてください。

質問者が選んだベストアンサー

  • ベストアンサー
  • jacta
  • ベストアンサー率26% (845/3158)
回答No.3

> 高速なプログラムを書く必要の出たときのために型に > よる処理速度を教えてください。 処理系に依存しますし、処理系のマニュアルにも記載されていない場合が多いので、自分でコンパイル結果を見ながら確認する必要があります。 組み込み用の処理系では、マニュアルにこの辺りの解説が書かれているものをよく見かけます。 一般的には、short型がint型より小さい場合は、何らかの演算の前には汎整数拡張によってint型に暗黙の型変換が起こりますので、その分だけ遅くなる場合があります。ただし、プロセッサのアーキテクチャによっては、こうしたオーバーヘッドが発生しないものも普通に存在します。 浮動小数点型の場合ですが、標準化以前のC言語では、float型はいったんdouble型に暗黙の型変換が行われてから演算していたのですが、標準Cではfloat型はfloat型のまま演算してもよいことになり、多くの処理系はそのようになっています。 また、可変個実引数や、関数原型のない関数の引数としてfloat型の値を渡した場合、既定の実引数拡張によってdouble型に暗黙の型変換が起こります。 いずれにしても、暗黙の型変換が発生し、それにコストがかかるような処理系では、クリティカルな処理では大きな影響が出ることが十分考えられます。

amazontester
質問者

お礼

かなり参考になりました。ありがとうございます。

その他の回答 (4)

  • moritan2
  • ベストアンサー率25% (168/670)
回答No.5

対象となるマシンや言語の実装によって違います。 一般的にインテルのCPUでは浮動小数点計算はdoubleの方が高速ですが、ゲーム機では断然 float の方が速いです。PS2とか今は亡きドリームキャストにはfloatを4つ同時に計算できるベクトル演算機を内蔵していますから。

amazontester
質問者

お礼

なるほど・・・。私のCPUはAMDのデュロンだったの でfloatの方が早く出たのかもしれません。PS2が floatの方が早いというのは面白いですね。

回答No.4

高速なプログラムを書くためには、アルゴリズムやデータ型を気にした方が遙かに有用だとは思いますが。 まず、int に対しては、「そのプロセッサで最も自然なデータの長さを int にする」傾向があります。このため、わざわざ型変換のはいる可能性のある、shot int よりも、速い場合が多いですね。 double に関しては、標準C言語では、浮動小数点データの基準は double だからというのがひとつあります。 たとえば、数学系の関数の返値や引数はすべて double です。また、小数点を含んだ定数( 0.1 とか)は、特に指定がない限り、double 型のデータです。(0.1f だと float 型の定数です) よって、 float x = 0.1; // x = (float)0.1; という暗黙の型変換 float y = sin(x); // y = (float)(sin((double)x)) という暗黙の型変換 などとすると、そのたびに型変換が発生します。 この分のオーバーヘッドでしょう。

  • ymmasayan
  • ベストアンサー率30% (2593/8599)
回答No.2

一口にshort、int、long、float、doubleといっても何バイトを割り当てるかは それぞれの処理系(ハードとコンパイラー)の実態に合わせて決めることに成っています。 従って一概には言えません。 例えばintを標準的に扱うマシンで仮にshortを扱うとすれば前後に変換が入る分だけ 遅くなります。 どうしても気になるならそれぞれの実装(機種とコンパイラー)で ベンチマークテストをやってみるしかありません

回答No.1

処理系(コンパイラ)によって異なるし、それに微々たるものです。 まずアルゴリズムとデータ構造で速くしましょう。 それ以上のパフォーマンスを求めるなら、実測してその結果で判断しましょう。

amazontester
質問者

お礼

そうですね。やはり自分のコードを早くしないと・・