我正在使用一些旧的Haskell代码进行攻击,并偶然发现了一个令人惊讶的优化。在进行一些分析之后,我注意到运行时在以下函数中花费了相当多的时间:
divisorCount = product . map ((+1).snd) . factorise'
我认为大多数工作都是在factorise'
完成的,但为了简洁起见,我应该将功能更改为:
divisorCount = product . map (succ.snd) . factorise'
当我重新编译并重新编译程序时,令我惊讶的是,运行时从0.495s
转到0.325s
!这是一个非常显着的速度提升!
为什么这种简单的改变会导致如此显着的性能提升?什么GHC可以在第二个功能中优化它在第一个功能中无法实现?
注意:
使用GHC版本7.6.3
两个基准都是使用-O2
两个基准运行时间均在10次试验中摊销