最近、私はベクトル記憶タイプを使って波形を計算するのに必要な時間を決定しようとしていました。厳密に計算のタイミングを決めるこのHaskell関数に問題はありますか?
このような長さなどを印刷しなくてもいいと思っていました。最後に、次の2つの定義を考えました。それは十分にシンプルなように見えますが、最初に関数を実行するときにゼロ以外の計算時間を期待通りに出力することがわかりますが、ここで怠けた場合の注意点がありますか?
import System.IO
import System.CPUTime
import qualified Data.Vector.Storable as V
timerIO f = do
start <- getCPUTime
x <- f
let !y = x
end <- getCPUTime
let diff = (fromIntegral (end - start))/(10^12)
print $ "Computation time: " ++ show diff ++ " sec\n"
timer f = timerIO $ do return f
main :: IO()
main = do
let sr = 1000.0
time = V.map (/ sr) $ V.enumFromN 0 120000 :: V.Vector Float
wave = V.map (\x -> sin $ x * 2 * pi * 10) time :: V.Vector Float
timer wave
timer wave
版画、
Computation time: 0.16001 sec
Computation time: 0.0 sec
は、任意の隠されたバグがここにありますか?私は実際に厳密性フラグを持つlet
が本当にここに行く最良の方法であるかどうか確信していません。これを書くより簡潔な方法がありますか?私が知っておくべきこれを既に行っている標準機能はありますか?
編集:私は基準について読んだことを言及する必要がありますが、この場合、プロファイリング専用の平均タイミングを計算するための堅牢な方法は探していませんでした。むしろ、アプリケーションの通常の実行中にいくつかの計算のタイミングをトレースするために、単一のタイマーを自分のプログラムに統合する単純な/低オーバーヘッドな方法を探していました。クライテリアはクールですが、これは若干異なるユースケースでした。
ありがとうございます!その理由は、私がモナドバインドにバングを追加しようとしたのですが、コンパイラによって許可されていないようです。しかし、私は文法が間違っている(変数の反対側にあるので)ことを知っています。 – Steve
おっと、typo。変数は '!x < - f'の前に来ます。 –
奇妙なことに、私は '!x < - f'を置くと"不正なバングパターン(use -XBangPatterns) "が出ます。 (そして、はい、 'x!< - f'も動作しませんでした)私はGHC 7.0.4を使用しています。 – Steve