Created
February 17, 2011 10:21
-
-
Save zandev/831449 to your computer and use it in GitHub Desktop.
Some benchmarks on solutions provided to exercise 5 chapter 3 of Real World Haskell
This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
| import Criterion | |
| import Criterion.Main (defaultMain, bench) | |
| -- Chris Forno 2008-09-03 | |
| isPalindromeLastInit :: (Eq a) => [a] -> Bool | |
| isPalindromeLastInit [] = False | |
| isPalindromeLastInit (x:[]) = True | |
| isPalindromeLastInit (x:y:[]) = x == y | |
| isPalindromeLastInit (x:xs) = x == last xs && isPalindromeLastInit (init xs) | |
| -- Arlen Cuss 2008-12-26 | |
| myIsPalindrome [] = True | |
| myIsPalindrome a | head a /= last a = False | |
| myIsPalindrome (x:xs) = myIsPalindrome (take (length xs - 1) xs) | |
| -- Chandran Doray 2009-01-16 | |
| isPalindromeReverse :: Eq a => [a] -> Bool | |
| isPalindromeReverse [] = True | |
| isPalindromeReverse [x] = True | |
| isPalindromeReverse a = a == reverse a | |
| -- Joel Neely 2009-04-07 | |
| isPalindromeRevtake vs = (drop n vs) == revtake m vs | |
| where len = length vs | |
| m = quot len 2 | |
| n = len - m | |
| revtake1 0 vs rs = rs | |
| revtake1 n (v:vs) rs = revtake1 (n-1) vs (v:rs) | |
| revtake1 n [] rs = rs | |
| revtake m vs = revtake1 m vs [] | |
| -- Blake Hegerle 2009-12-04 | |
| isPalindromeRaw l = p l [] 0 | |
| where | |
| p (x:xs) r n = p (xs) (x:r) (n + 1); | |
| p [] r n = q l r (n / 2); | |
| q l r n | n < 1 = True; | |
| q (x:xs) (y:ys) n = x == y && (q xs ys (n - 1)) | |
| testAll f = map f [dataA, dataB, dataC] | |
| -- | |
| dataLength = 9999 | |
| dataA = [1..(dataLength/2)] ++ reverse [1..(dataLength/2)] | |
| dataB = [1..dataLength] | |
| dataC = [1..(dataLength/3)] ++ [1..(dataLength/3)] ++ reverse [1..(dataLength/3)] | |
| main = defaultMain [ | |
| bgroup "palindrome" [ | |
| bench "Reverse" $ whnf isPalindromeReverse dataA | |
| , bench "Last Init" $ whnf isPalindromeLastInit dataA | |
| , bench "Take Length" $ whnf myIsPalindrome dataA | |
| , bench "Revised Take" $ whnf isPalindromeRevtake dataA | |
| , bench "Raw" $ whnf isPalindromeRaw dataA | |
| ] | |
| , bgroup "no" [ | |
| bench "Reverse" $ whnf isPalindromeReverse dataB | |
| , bench "Last Init" $ whnf isPalindromeLastInit dataB | |
| , bench "Take Length" $ whnf myIsPalindrome dataB | |
| , bench "Revised Take" $ whnf isPalindromeRevtake dataB | |
| , bench "Raw" $ whnf isPalindromeRaw dataB | |
| ] | |
| , bgroup "fake" [ | |
| bench "Reverse" $ whnf isPalindromeReverse dataC | |
| , bench "Last Init" $ whnf isPalindromeLastInit dataC | |
| , bench "Take Length" $ whnf myIsPalindrome dataC | |
| , bench "Revised Take" $ whnf isPalindromeRevtake dataC | |
| , bench "Raw" $ whnf isPalindromeRaw dataC | |
| ] | |
| ] |
Sign up for free
to join this conversation on GitHub.
Already have an account?
Sign in to comment