4

この記事を参照してください: math-round-vs-hack

数学関数が最適化されています。

(num+0.5)|0の代わりに使用しMath.round()ます。

しかし、num> 2147483647の場合、間違った結果が出るという混乱を招く問題があります。

function round(n) {
    return (n + 0.5) | 0;
};

round(2147483648)-2147483648を返します

そしてウィキペディアによると:

コンピューティングにおける2147483647

数値2,147,483,647は、>コンピューティングにおける32ビット符号付き整数の最大値でもあります。したがって、これは、一般的なCPUで実行されている多くのプログラミング言語でintとして宣言されている変数の最大値であり、多くのビデオゲームで可能な最大スコア(または金額)です。数値の出現は、多くの場合、エラー、オーバーフロー状態、または値の欠落を反映しています。[8] 同様に、「(214)748-3647」は、米国の電話番号として表される数字のシーケンスであり、Webページにリストされている最も一般的な電話番号です。[9] Unixなどのオペレーティングシステムで使用されるデータ型time_tは、Unixエポックの開始(1の深夜UTC> 1970年1月)からの秒数をカウントする32ビットの符号付き整数です。[10] この方法で表すことができる最新の時刻は、火曜日の03:14:07UTCです。

良好なパフォーマンスを確保するために、この状況にどのように対処できますか?

4

1 に答える 1

4

簡単な答え:Math.round()を使用する

この演習全体を「マイクロ最適化を絶対に行わない理由」の下に提出します。このフィドルを見てください:http://jsfiddle.net/toxicsyntax/a5rWm/2/

さまざまなブラウザからの結果を次に示します。

  • Firefox 11:ラウンド:185ミリ秒bit_round:123ミリ秒(100000000回の反復の場合)
  • Chrome 18:ラウンド:99ミリ秒bit_round:96ミリ秒(100000000回の反復の場合)
  • IE 9:ラウンド:227ミリ秒bit_round:123ミリ秒(1000000回の反復の場合)
  • iPhone 4、Safari:ラウンド399ミリ秒、bit_round 32ミリ秒(1000000回の反復の場合)

確かに、最良の場合、ビット単位のラウンド関数はMath.round()を使用するよりもはるかに高速ですが、それは本当に重要ですか?最悪の場合、Math.round()は依然として数百万ラウンドを処理します。問題なく秒。

何回丸める必要がありますか?数値を表示する場合を除いて、また何千もの丸められた数値を表示している場合でも、javascriptで数値を丸める必要はないと思います。第二に、Math.round()はまだ十分に高速です。

アップデート

また、一般的なマイクロ最適化については、コーディングホラーの記事http://www.codinghorror.com/blog/2009/01/the-sad-tragedy-of-micro-optimization-theaterを確認してください。 html

マイクロ最適化が非常にまれに良いアイデアです。

于 2012-04-18T08:44:15.840 に答える