Inconsistent loop performance
Here are two small benchmarks:
import Criterion.Main
foo :: Int -> Int -> Int
foo n k | n <= 0 = k
| otherwise = foo (n-1) (k+1)
bar :: Int -> Int -> Int
bar n k | n == 0 = k
| otherwise = bar (n-1) (k+1)
main :: IO ()
main = defaultMain [ bench "foo" $ nf (uncurry foo) (20000000,0)
, bench "bar" $ nf (uncurry bar) (20000000,0)
]
On my laptop, I consistently get a mean running time of about 36ms for foo and about 45ms for bar. This is a rather big difference. The Core looks about the same and going via C gives me about 42ms for both loops so this is certainly a code generator problem.
Trac metadata
| Trac field | Value |
|---|---|
| Version | 6.13 |
| Type | Bug |
| TypeOfFailure | OtherFailure |
| Priority | normal |
| Resolution | Unresolved |
| Component | Compiler |
| Test case | |
| Differential revisions | |
| BlockedBy | |
| Related | |
| Blocking | |
| CC | |
| Operating system | |
| Architecture |