我正在测试此递归Haskell函数的性能,该函数重复累加一个无限列表的前100000000个整数(使用Conduit管道),并打印每次执行的经过时间:
import Conduit
import Data.Time.Clock
evaluate_listC 0 = return ()
evaluate_listC i = do
startTime <- getCurrentTime
print $ runConduitPure $ yieldMany [1..] .| takeC 100000000 .| sumC
endTime <- getCurrentTime
print $ diffUTCTime endTime startTime
evaluate_listC (i-1)
Run Code Online (Sandbox Code Playgroud)
编译(带有-O标志)并运行代码,并对该函数进行10次迭代,我获得以下执行时间:
38.2066878s
4.3696857s
1.3367605s
0.9950032s
0.9399968s
0.9039936s
0.9079987s
0.9119587s
0.9090151s
0.8749654s
Run Code Online (Sandbox Code Playgroud)
为什么第一次迭代(以及第二次迭代)要花费更多的时间,而随后的迭代却要快得多?