1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58
|
{-# LANGUAGE BangPatterns #-}
{-# LANGUAGE ScopedTypeVariables #-}
module PrimArray.Compare
( benchmarkLt
, benchmarkLtDef
, benchmarkLte
, benchmarkLteDef
, argumentA
, argumentB
) where
import Data.Primitive
import Data.Word
import Control.Monad
import Control.Monad.ST (runST)
import GHC.Exts (fromList)
benchmarkLtDef :: PrimArray Int -> PrimArray Int -> Bool
benchmarkLtDef a b = case compare a b of
LT -> True
_ -> False
benchmarkLteDef :: PrimArray Int -> PrimArray Int -> Bool
benchmarkLteDef a b = case compare a b of
GT -> False
_ -> True
benchmarkLt :: PrimArray Int -> PrimArray Int -> Bool
benchmarkLt a b =
let !sz1 = sizeofPrimArray a
!sz2 = sizeofPrimArray b
!sz = min sz1 sz2
loop !i
| i < sz = if indexPrimArray a i < indexPrimArray b i
then True
else loop (i + 1)
| otherwise = sz1 < sz2
in loop 0
benchmarkLte :: PrimArray Int -> PrimArray Int -> Bool
benchmarkLte a b =
let !sz1 = sizeofPrimArray a
!sz2 = sizeofPrimArray b
!sz = min sz1 sz2
loop !i
| i < sz = if indexPrimArray a i <= indexPrimArray b i
then loop (i + 1)
else False
| otherwise = sz1 < sz2
in loop 0
argumentA :: PrimArray Int
argumentA = fromList (enumFromTo 0 8000 ++ [55])
argumentB :: PrimArray Int
argumentB = fromList (enumFromTo 0 8000 ++ [56])
|