Fungsi main
Anda tidak benar. Kecuali qsort1
merupakan tindakan IO
Anda tidak dapat melakukannya di monad IO. Sebagai gantinya, Anda bisa memasukkannya ke dalam ikatan let:
main = do
start <- getCurrentTime
let x = qsort1 (take 1000000 $ randomRs ((1 :: Int), 100000) (mkStdGen 42))
end <- getCurrentTime
print (diffUTCTime end start)
Perhatikan juga bahwa saya telah secara eksplisit memberikan anotasi tipe untuk 1
untuk menghindari beberapa kesalahan kompilasi.
Namun demikian, Anda sebenarnya tidak dapat menemukan total waktu yang dibutuhkan untuk melakukan penyortiran karena evaluasi yang malas. x
tidak akan pernah dihitung karena tidak pernah digunakan dalam program. Jika Anda menjalankan main
, ini memberi Anda keluaran yang jelas salah:
λ> main
0.000001s
Sebagai gantinya, Anda dapat menggunakan ini untuk menghitung perhitungannya:
main = do
start <- getCurrentTime
let x = qsort1 (take 1000000 $ randomRs ((1 :: Int), 100000) (mkStdGen 42))
print x
end <- getCurrentTime
print (diffUTCTime end start)
Daripada mencetak, Anda juga dapat menggunakan ekstensi BangPatterns
untuk memaksa penghitungan qsort1
:
main = do
start <- getCurrentTime
let !x = qsort1 (take 1000000 $ randomRs ((1 :: Int), 100000) (mkStdGen 42))
end <- getCurrentTime
print (diffUTCTime end start)
BangPatterns
tidak akan mengarah pada evaluasi penuh seperti yang ditunjukkan oleh @kosmikus. Sebagai gantinya gunakan perpustakaan seperti criterion
yang khusus dibuat untuk benchmarking.
person
Sibi
schedule
17.07.2015