Re:浮動小数点数を整数にする高速(?)な方法 - JavaScript比較
http://javascript.g.hatena.ne.jp/edvakf/20090203/1233678994
とくに反省は無い……
http://d.hatena.ne.jp/Kureduki_Maari/20090204/1233685537
を参照せよ。)
浮動小数点数を整数にするには、僕は普段、
n = Math.abs(Math.floor(Number(n)));
とやっている。とりあえずどんなObjectだろうと整数かNaNに出来る。
方法を幾つか試して、タイムをとってみた。
(以下表↓)
time (ms) | Math.abs(Math.floor(Number)) | Math.floor(Math.abs(Number)) | parseInt(Number) |
---|---|---|---|
Opera 10.00alpha | 8422 | 8219 | 23640 |
Chrome 1.0 | 1500 | 1834 | 1607 |
Firefox 3.1b2 | 377 | 407 | 394 |
Safari 3.2 | 3758 | 3920 | 17980 |
IE 8 Beta2 | 13590 | 13120 | 21410 |
繰り返し回数は5000000。
結構はっきりした傾向がでた。
僕はCもC++も勉強した事がないので、原因はわからないが。
OperaとIEではMath.floor(Math.abs(Number))が速い。
Chrome, Firefox, SafariではMath.abs(Math.floor(Number))が速い。
というのが傾向。何故?
Opera, Safari, IEのparseInt(Number)が遅いのは、
Number -> Number.toString() -> parseInt(String)
という手順を踏んでいる為と思われる。
他でも、parseInt(Number)をparseInt(Number.toString())にしたら、やたら遅くなった(Firefox: 35118ms, Chrome: 2873ms)。
ということで、parseInt()は、この目的には使わない方がよさそうだ。
Math.abs(Math.floor())にするか、Math.floor(Math.abs())にするかは、好みで良いと思う。
ベンチマークのコードは以下の通り。
<html> <head></head> <body> <script type="application/javascript"> var _round = 5000000; var i = 0; var _n = 497498.4627356; var n = _n; var t1 = 0, t2 = 0; t1 = (new Date()).getTime(); for(; i<_round; ++i){ n = _n; n = Math.abs(Math.floor(n)); } t2 = (new Date()).getTime(); document.write("abs,floor: " + (t2-t1) + "<br/>"); i = 0; t1 = (new Date()).getTime(); for(; i<_round; ++i){ n = _n; n = Math.floor(Math.abs(n)); } t2 = (new Date()).getTime(); document.write("floor,abs: " + (t2-t1) + "<br/>"); i = 0; t1 = (new Date()).getTime(); for(; i<_round; ++i){ n = _n; n = parseInt(n); } t2 = (new Date()).getTime(); document.write("parseInt: " + (t2-t1) + "<br/>"); document.close(); </script> </body> </html>