私は、x86上のテストの後、この答えを書きたくなかったが、SPARC Solaris上でのテストでは、それは「明白な解決策」と比較して、パフォーマンスゲインを持っていた示したので、多分それは誰かに有用であろう。私はHacker's Delightという書籍に付随するa PDFから取り上げました。ここではそれが行く:
unsigned msec2sec(unsigned n) {
unsigned q, r, t;
n = n + 500;
t = (n >> 7) + (n >> 8) + (n >> 12);
q = (n >> 1) + t + (n >> 15) + (t >> 11) + (t >> 14);
q = q >> 9;
r = n - q*1000;
return q + ((r + 24) >> 10);
}
と対照的に:
unsigned msec2sec_obvious(unsigned n) {
return (n + 500)/1000;
}
x86では「明白なアルゴリズムは」その後の上位32ビットをつかん続い274877907によって長い乗算を、500を追加しに変換しますedxと6ビット右シフト - それは手の上にこのコードを打つ(〜5倍のパフォーマンスの差)。
しかし、Solaris/sparcでは、 "明らか"が.udivの呼び出しに変換されます。これは、すべて別の方向で〜2.5倍の性能差を与えることが判明しています。
どのようにして1500と2500を丸めますか(ヒント:いくつかの言語でアルゴリズムを選択させるhttp://msdn.microsoft.com/en-us/library/system.midpointrounding.aspx) –