読者です 読者をやめる 読者になる 読者になる

プログラムdeタマゴ

nodamushiの著作物は、文章、画像、プログラムにかかわらず全てUnlicenseです

StrictMath?Math?何が違うんだ?

JAVA

Mathのソースコードを見てみるとほとんどがreturn StrictMath.******となっている……



え?Mathっているのこれ?


 実というと、MathとStrictMathの違いは結果が環境依存か否か、という所にある。

 Mathの関数は環境に依存した計算をする。実行環境に高速に演算をするライブラリや回路が組み込まれていたら、それを使うので高速に計算する。ただ、環境によって微妙に結果が異なることがある。まぁ、PCで動かす場合は基本インテルのCPUだから、結果に差はないはず。。。


 一方で、StrictMathはどの環境のJVMで実行しても必ず同じ結果が返ることを約束したクラス。結果が同じになるように厳格にJVMで演算しているため基本的に遅い。計算にはFreely Distributable Math Libraryのバージョン5.3を利用している。


といっても、高速計算できないのであれば、基本的にはどっちを選んでも速度差はでない。組み込み系など、最低限の計算回路、ライブラリーしかないのであれば、MathもStrictMathも同じである。


というわけで、私の環境でStrictMathとMathの速度の差を適当に調べてみた。
 
 

rint
102857548 nano seconds:Math Time
77475719 nano seconds:StrictMath Time
Strict/Math:75%
cos
6692303 nano seconds:Math Time
886676881 nano seconds:StrictMath Time
Strict/Math:13249%
sin
6723644 nano seconds:Math Time
812551527 nano seconds:StrictMath Time
Strict/Math:12084%
tan
6759436 nano seconds:Math Time
1064150031 nano seconds:StrictMath Time
Strict/Math:15743%
log
6691879 nano seconds:Math Time
1510311835 nano seconds:StrictMath Time
Strict/Math:22569%
log10
4572315 nano seconds:Math Time
1482144821 nano seconds:StrictMath Time
Strict/Math:32415%
log1p
1291014922 nano seconds:Math Time
1290766298 nano seconds:StrictMath Time
Strict/Math:99%
abs(dobule)
6739536 nano seconds:Math Time
13583942 nano seconds:StrictMath Time
Strict/Math:201%
abs(int)
4550845 nano seconds:Math Time
4558468 nano seconds:StrictMath Time
Strict/Math:100%
cbrt
1809522809 nano seconds:Math Time
1810118408 nano seconds:StrictMath Time
Strict/Math:100%
exp
1034890357 nano seconds:Math Time
1035672870 nano seconds:StrictMath Time
Strict/Math:100%
acos(1以下)
674385523 nano seconds:Math Time
673950908 nano seconds:StrictMath Time
Strict/Math:99%
acos(1以上)
1026351976 nano seconds:Math Time
1024168133 nano seconds:StrictMath Time
Strict/Math:99%
max(int,int)
4569641 nano seconds:Math Time
4580604 nano seconds:StrictMath Time
Strict/Math:100%
max(double,double)
53852134 nano seconds:Math Time
53751352 nano seconds:StrictMath Time
Strict/Math:99%
copySign
6716700 nano seconds:Math Time
6739418 nano seconds:StrictMath Time
Strict/Math:100%
floor(double)
323757141 nano seconds:Math Time
324181588 nano seconds:StrictMath Time
Strict/Math:100%
floor(float)
306130199 nano seconds:Math Time
323639985 nano seconds:StrictMath Time
Strict/Math:105%
ceil
310019530 nano seconds:Math Time
310021355 nano seconds:StrictMath Time
Strict/Math:100%
getExponent
6870053 nano seconds:Math Time
6711205 nano seconds:StrictMath Time
Strict/Math:97%
atan2
1378180672 nano seconds:Math Time
1374000402 nano seconds:StrictMath Time
Strict/Math:99%
cosh
1439859257 nano seconds:Math Time
1443621593 nano seconds:StrictMath Time
Strict/Math:100%
IEEEremainder
1146785504 nano seconds:Math Time
1155589420 nano seconds:StrictMath Time
Strict/Math:100%
round
321884862 nano seconds:Math Time
320347544 nano seconds:StrictMath Time
Strict/Math:99%
nextUp
88135517 nano seconds:Math Time
87508303 nano seconds:StrictMath Time
Strict/Math:99%
hypot
5777637091 nano seconds:Math Time
5758355501 nano seconds:StrictMath Time
Strict/Math:99%
expm1
911480154 nano seconds:Math Time
911503621 nano seconds:StrictMath Time
Strict/Math:100%
toDegrees
4563283 nano seconds:Math Time
4715274 nano seconds:StrictMath Time
Strict/Math:103%
toRadians
4555259 nano seconds:Math Time
4541609 nano seconds:StrictMath Time
Strict/Math:99%
ulp
114184270 nano seconds:Math Time
114305497 nano seconds:StrictMath Time
Strict/Math:100%
signum
4694733 nano seconds:Math Time
4559608 nano seconds:StrictMath Time
Strict/Math:97%
scalb
143902369 nano seconds:Math Time
141858259 nano seconds:StrictMath Time
Strict/Math:98%
nextAfter
104254790 nano seconds:Math Time
104830778 nano seconds:StrictMath Time
Strict/Math:100%
pow
3155025690 nano seconds:Math Time
3129366808 nano seconds:StrictMath Time
Strict/Math:99%
 
cosやらsinの三角関数、指数関数は桁違いに遅くなりますね。
でもacosとかは実行速度に違いがない。
JavaDocにパフォーマンスがどうのこうのと書かれていたcopySignは実行速度の差がなかったね。

 
驚いたのは、唯一rintはStrictMathの方がベンチが早かったです。
 
 
Mathを使うべきかStrictMathを使うべきか判断の基準の一つにでもしてもらえれば幸いです。