|
1 | | -module Measure (benchAndRunCSorts, benchAndRunDataVecSorts, benchOnArrays, bench, benchPar, dotrialIO, benchIO, benchParIO) where |
| 1 | +module Measure (benchAndRunCSorts, benchAndRunCxxSorts, benchAndRunDataVecSorts, benchOnArrays, bench, benchPar, dotrialIO, benchIO, benchParIO) where |
2 | 2 |
|
3 | 3 | import Control.Exception (evaluate) |
4 | 4 | import Control.Monad.Par hiding (runParIO) |
@@ -157,6 +157,13 @@ sortFnC alg = case alg of |
157 | 157 | Quicksort -> FFI.c_quicksort |
158 | 158 | _ -> error "sortFnC: Csort not implemented!" |
159 | 159 |
|
| 160 | +sortFnCxx :: SortAlgo -> FFI.SortFnCxx |
| 161 | +sortFnCxx alg = case alg of |
| 162 | + Insertionsort -> FFI.cxx_int_insertionsort |
| 163 | + Mergesort -> FFI.cxx_int_mergesort |
| 164 | + Quicksort -> FFI.cxx_int_quicksort |
| 165 | + _ -> error "sortFnCxx: Csort not implemented!" |
| 166 | + |
160 | 167 | -- return type : IO ([Int64], Double, Double) |
161 | 168 | -- [Int64]: sorted output array from the last iteration that was run |
162 | 169 | -- Double: median runtime from the iterations that were run (selftimed) |
@@ -184,3 +191,31 @@ benchAndRunCSorts salg arr iters = do |
184 | 191 | putStrLn ("iter time: " ++ show delt) |
185 | 192 | !sortedArr <- peekArray arrLength (castPtr sortedPtr :: Ptr Int64) |
186 | 193 | return $! (sortedArr, delt) |
| 194 | + |
| 195 | +-- return type : IO ([Int64], Double, Double) |
| 196 | +-- [Int64]: sorted output array from the last iteration that was run |
| 197 | +-- Double: median runtime from the iterations that were run (selftimed) |
| 198 | +-- Double: Total time taken to run all the iterations (batchtime) |
| 199 | +benchAndRunCxxSorts :: SortAlgo -> [Int64] -> Int -> IO ([Int64], Double, Double) |
| 200 | +benchAndRunCxxSorts salg arr iters = do |
| 201 | + !tups <- mapM (\_ -> do |
| 202 | + !ptr <- newArray arr |
| 203 | + res <- dotrialCxx salg (length arr) ptr |
| 204 | + pure res |
| 205 | + ) [1..iters] |
| 206 | + let (results, times) = unzip tups |
| 207 | + -- print times |
| 208 | + let selftimed = median times |
| 209 | + batchtime = sum times |
| 210 | + return $! (last results, selftimed, batchtime) |
| 211 | + where |
| 212 | + dotrialCxx alg arrLength ptr = do |
| 213 | + performMajorGC |
| 214 | + let fn = sortFnCxx alg |
| 215 | + t1 <- getCurrentTime |
| 216 | + !sortedPtr <- fn ptr (fromIntegral arrLength) |
| 217 | + t2 <- getCurrentTime |
| 218 | + let delt = fromRational (toRational (diffUTCTime t2 t1)) |
| 219 | + putStrLn ("iter time: " ++ show delt) |
| 220 | + !sortedArr <- peekArray arrLength (castPtr sortedPtr :: Ptr Int64) |
| 221 | + return $! (sortedArr, delt) |
0 commit comments