Double
次のコードは、型の数を型の 1 つに切り捨てますWord16
(他の単語の型も同様に動作すると思われますが、例として 1 つを選択する必要がありました)。
truncate1 :: Double -> Word16
truncate1 = fromIntegral . (truncate :: Double -> Int)
ご覧のとおり、最初に に切り捨ててからInt
、 にキャストしWord16
ます。この関数を直接の切り捨てに対してベンチマークしました。
truncate2 :: Double -> Word16
truncate2 = truncate
驚いたことに、最初のバージョン (最初にInt
型を調べたもの) の方がパフォーマンスがはるかに優れていました。または2番目はさらに悪い。基準出力によると:
benchmarking truncate/truncate1
mean: 25.42399 ns, lb -47.40484 ps, ub 67.87578 ns, ci 0.950
std dev: 145.5661 ns, lb 84.90195 ns, ub 244.2057 ns, ci 0.950
found 197 outliers among 100 samples (197.0%)
97 (97.0%) low severe
100 (100.0%) high severe
variance introduced by outliers: 99.000%
variance is severely inflated by outliers
benchmarking truncate/truncate2
mean: 781.0604 ns, lb 509.3264 ns, ub 1.086767 us, ci 0.950
std dev: 1.436660 us, lb 1.218997 us, ub 1.592479 us, ci 0.950
found 177 outliers among 100 samples (177.0%)
77 (77.0%) low severe
100 (100.0%) high severe
variance introduced by outliers: 98.995%
variance is severely inflated by outliers
正直、Criterion は使い始めたばかりなので、使い慣れていません25.42399 ns
が、 よりも短い実行時間であることは理解してい781.0604 ns
ます。ここで何らかの専門化が役割を果たしているのではないかと思います。truncate2
遅すぎませんか?その場合、truncate
改善できますか?さらに、もっと速い方法を知っている人はいますか? あまり使っていない型に何か間違ったキャストをしたい気がします。
前もって感謝します。
私は GHC-7.4.2 でコンパイルしており、最適化が有効になっています ( -O2
)。