| 1 | {-# LANGUAGE BangPatterns #-} |
|---|
| 2 | |
|---|
| 3 | module Main where |
|---|
| 4 | |
|---|
| 5 | import Criterion.Main |
|---|
| 6 | |
|---|
| 7 | f :: Int -> Int -> Int -> Int -> Int |
|---|
| 8 | f !i !j !s !m |
|---|
| 9 | | i == 0 = s+m |
|---|
| 10 | | otherwise = f (i-1) (j-1) (s + i+1) (m + j*5) |
|---|
| 11 | |
|---|
| 12 | g :: Int -> Int |
|---|
| 13 | g !k = f k k 0 0 |
|---|
| 14 | |
|---|
| 15 | |
|---|
| 16 | ff :: Int -> Int -> Int -> Int |
|---|
| 17 | ff !i !s !m |
|---|
| 18 | | i == 0 = s+m |
|---|
| 19 | | otherwise = ff (i-1) (s + i+1) (m + i*5) |
|---|
| 20 | |
|---|
| 21 | gg :: Int -> Int |
|---|
| 22 | gg !k = ff k 0 0 |
|---|
| 23 | |
|---|
| 24 | |
|---|
| 25 | |
|---|
| 26 | {- |
|---|
| 27 | main = do |
|---|
| 28 | print $ g 20 |
|---|
| 29 | print $ gg 20 |
|---|
| 30 | -} |
|---|
| 31 | |
|---|
| 32 | main = defaultMain |
|---|
| 33 | [ bench " g" $ whnf g 20 -- 67.9ns |
|---|
| 34 | , bench "gg" $ whnf gg 20 -- 64.5ns |
|---|
| 35 | ] |
|---|