c4se記:さっちゃんですよ☆

.。oO(さっちゃんですよヾ(〃l _ l)ノ゙☆)

.。oO(此のblogは、主に音樂考察Programming に分類されますよ。ヾ(〃l _ l)ノ゙♬♪♡)

音樂は SoundCloud に公開中です。

考察は現在は主に Scrapbox で公表中です。

Programming は GitHub で開發中です。

浮動小数点数を整数にする高速(?)な方法 - JavaScript比較

(追記:

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>