- Contents -
Javaで少数点を扱う計算について
最近のコンピュータでは基本的にはあまり気にする必要はないけれども、
ゲーム開発などで、頻繁にコールされる事が想定される部分に関しては
少数点を扱う場合に少しだけ処理速度を気にしておいた方が良いと思う。
昔は、FPU(浮動小数点演算CPU)が搭載されていないコンピュータがあった為、
頻繁に気にしていたみたい。(ガラケー時代とか)
とはいえ、整数だけの演算処理と、
小数点を扱う計算では計算コストが明らかに違うという事を知っておく必要はあると思う。
int / double の演算速度
intとdoubleでの四則演算の処理速度を測ってみました。参考まで
こんなコードで、それぞれ演算子を替えて測定してみた。
// int の計算
int val = 0;
for (int i = 0; i < 1000000000; i++)
{
val = val + 2;
}
// double の計算
double val = 0;
for (int i = 0; i < 1000000000; i++)
{
val = val + 2.0;
}
測定結果
処理時間[ms] (int) | 処理時間[ms] (double) | |
---|---|---|
加算 | 2 | 1116 |
減算 | 2 | 1099 |
乗算 | 479 | 1557 |
除算 | 1453 | 1517 |
同じ処理をしているのに、int と double ではここまで、処理速度が違う。
除算(割り算)にかんしては、大して差がないようです。
できるだけ工夫しよう
例えば、double を使わないように先に掛け算を行ってから割り算をすると処理速度を早くする事ができます。
この場合、計算時に桁数があがってしまい、オーバーフローする可能性もあるので注意
int diff = max - base;
int val = diff * (level - 1) / (maxLevel - 1);
// ==> PROCESS_TIME: 2623[ms]
int diff = max - base;
int val = diff * ((double)level - 1) / (maxLevel - 1);
// ==> PROCESS_TIME: 5283[ms]
割合を計算してから計算する場合、2倍くらい速度差がある。
(10億回繰り返して測定)
おしまい
どこでも気にした方がいいかと言われると、そうではなく。
基本、可読性を重視してわかりやすく書く事の方が大事だと思います。
その後、何かしらボトルネックになっている可能性のある時に、
実際に処理速度を測って、実測値を元に最適化していく方が良いでしょう。