Q: 3 を浮動小数点数に変換するため、前者の比較を実行すると遅くなりますか、それとも実際にはまったく違いはありませんか?
A) 整数として指定してください。一部のチップには、実行時に整数と比較するための特別な命令がありますが、コンパイラが最適なものを選択するため、これは重要ではありません。ターゲット アーキテクチャによっては、コンパイル時に 3.0 に変換される場合があります。それ以外の場合は、intのままになります。ただし、具体的に 3 が必要なため、「3」を指定します。
明らかに、時間遅延はせいぜい無視できると想定していますが、while(1) ループで複合化すると、長期的にはかなりの時間が失われる可能性があると思います (実際に遅い場合)。
A) コンパイラは、そのようなコードに対して奇妙なことは何もしません。最適なものを選択するので、時間の遅れはありません。数値定数を使用すると、コンパイラは、同じ結果を生成する限り、見た目に関係なく、最善のことを自由に実行できます。ただし、このタイプの比較を while ループで複合することはまったく望ましくありません。代わりに、整数ループ カウンターを使用します。浮動小数点ループ カウンターは、はるかに遅くなります。フロートをループ カウンターとして使用する必要がある場合は、単一ポイントの 32 ビット データ型を優先し、できるだけ比較を少なくします。
たとえば、問題を複数のループに分割できます。
int x = 0;
float y = 0;
float finc = 0.1;
int total = 1000;
int num_times = total / finc;
num_times -= 2;// safety
// Run the loop in a safe zone using integer compares
while (x < num_times) {
// Do stuff
y += finc;
x++;
}
// Now complete the loop using float compares
while (y < total) {
y+= finc;
}
これにより、比較速度が大幅に向上します。