f0cb315452faea6fee8144489629e63e9bd7b303Christian Maeder{-# LANGUAGE CPP #-}
f0cb315452faea6fee8144489629e63e9bd7b303Christian Maeder{- |
e9458b1a7a19a63aa4c179f9ab20f4d50681c168Jens ElknerModule : ./Common/Timing.hs
f0cb315452faea6fee8144489629e63e9bd7b303Christian MaederDescription : utility module for measuring execution time
f0cb315452faea6fee8144489629e63e9bd7b303Christian MaederCopyright : (c) C. Maeder DFKI GmbH
98890889ffb2e8f6f722b00e265a211f13b5a861Corneliu-Claudiu ProdescuLicense : GPLv2 or higher, see LICENSE.txt
f0cb315452faea6fee8144489629e63e9bd7b303Christian Maeder
f0cb315452faea6fee8144489629e63e9bd7b303Christian MaederMaintainer : Christian.Maeder@dfki.de
f0cb315452faea6fee8144489629e63e9bd7b303Christian MaederStability : provisional
f0cb315452faea6fee8144489629e63e9bd7b303Christian MaederPortability : portable
f0cb315452faea6fee8144489629e63e9bd7b303Christian Maeder
f0cb315452faea6fee8144489629e63e9bd7b303Christian MaederUtility functions that can't be found in the libraries
f0cb315452faea6fee8144489629e63e9bd7b303Christian Maeder but should be shared across Hets.
f0cb315452faea6fee8144489629e63e9bd7b303Christian Maeder-}
f0cb315452faea6fee8144489629e63e9bd7b303Christian Maeder
f0cb315452faea6fee8144489629e63e9bd7b303Christian Maedermodule Common.Timing where
f0cb315452faea6fee8144489629e63e9bd7b303Christian Maeder
f0cb315452faea6fee8144489629e63e9bd7b303Christian Maeder#ifdef UNIX
f0cb315452faea6fee8144489629e63e9bd7b303Christian Maederimport System.Posix.Time
f0cb315452faea6fee8144489629e63e9bd7b303Christian Maederimport System.Posix.Types
f0cb315452faea6fee8144489629e63e9bd7b303Christian Maeder#else
f0cb315452faea6fee8144489629e63e9bd7b303Christian Maederimport Data.Time.Clock
f0cb315452faea6fee8144489629e63e9bd7b303Christian Maeder#endif
f0cb315452faea6fee8144489629e63e9bd7b303Christian Maeder
abdc8c3bcf5b761e9bebf51e6ba2bce659d29512Eugen Kuksaimport Data.Fixed
f0cb315452faea6fee8144489629e63e9bd7b303Christian Maederimport Data.Time
f0cb315452faea6fee8144489629e63e9bd7b303Christian Maederimport Control.Monad
abdc8c3bcf5b761e9bebf51e6ba2bce659d29512Eugen Kuksaimport Numeric
f0cb315452faea6fee8144489629e63e9bd7b303Christian Maeder
4a6032790570e790438ad99706beff11509184eaChristian Maedernewtype HetsTime = HetsTime
f0cb315452faea6fee8144489629e63e9bd7b303Christian Maeder#ifdef UNIX
4a6032790570e790438ad99706beff11509184eaChristian Maeder EpochTime
f0cb315452faea6fee8144489629e63e9bd7b303Christian Maeder#else
4a6032790570e790438ad99706beff11509184eaChristian Maeder UTCTime
f0cb315452faea6fee8144489629e63e9bd7b303Christian Maeder#endif
f0cb315452faea6fee8144489629e63e9bd7b303Christian Maeder
f0cb315452faea6fee8144489629e63e9bd7b303Christian MaedergetHetsTime :: IO HetsTime
f0cb315452faea6fee8144489629e63e9bd7b303Christian MaedergetHetsTime = liftM HetsTime
f0cb315452faea6fee8144489629e63e9bd7b303Christian Maeder#ifdef UNIX
f0cb315452faea6fee8144489629e63e9bd7b303Christian Maeder epochTime
f0cb315452faea6fee8144489629e63e9bd7b303Christian Maeder#else
f0cb315452faea6fee8144489629e63e9bd7b303Christian Maeder getCurrentTime
f0cb315452faea6fee8144489629e63e9bd7b303Christian Maeder#endif
f0cb315452faea6fee8144489629e63e9bd7b303Christian Maeder
abdc8c3bcf5b761e9bebf51e6ba2bce659d29512Eugen KuksameasureWallTime :: IO a -> IO (a, TimeOfDay)
abdc8c3bcf5b761e9bebf51e6ba2bce659d29512Eugen KuksameasureWallTime f = do
abdc8c3bcf5b761e9bebf51e6ba2bce659d29512Eugen Kuksa startTime <- getHetsTime
abdc8c3bcf5b761e9bebf51e6ba2bce659d29512Eugen Kuksa result <- f
abdc8c3bcf5b761e9bebf51e6ba2bce659d29512Eugen Kuksa endTime <- getHetsTime
abdc8c3bcf5b761e9bebf51e6ba2bce659d29512Eugen Kuksa let wallTimeUsed = diffHetsTime endTime startTime
abdc8c3bcf5b761e9bebf51e6ba2bce659d29512Eugen Kuksa return (result, wallTimeUsed)
abdc8c3bcf5b761e9bebf51e6ba2bce659d29512Eugen Kuksa
f0cb315452faea6fee8144489629e63e9bd7b303Christian MaederdiffHetsTime :: HetsTime -> HetsTime -> TimeOfDay
f0cb315452faea6fee8144489629e63e9bd7b303Christian MaederdiffHetsTime (HetsTime t1) (HetsTime t2) =
f0cb315452faea6fee8144489629e63e9bd7b303Christian Maeder timeToTimeOfDay $ secondsToDiffTime $ round
f0cb315452faea6fee8144489629e63e9bd7b303Christian Maeder (realToFrac (
f0cb315452faea6fee8144489629e63e9bd7b303Christian Maeder#ifdef UNIX
41582f75931338095dc749c455593c859376d593Christian Maeder (-)
f0cb315452faea6fee8144489629e63e9bd7b303Christian Maeder#else
f0cb315452faea6fee8144489629e63e9bd7b303Christian Maeder diffUTCTime
f0cb315452faea6fee8144489629e63e9bd7b303Christian Maeder#endif
f0cb315452faea6fee8144489629e63e9bd7b303Christian Maeder t1 t2) :: Double)
abdc8c3bcf5b761e9bebf51e6ba2bce659d29512Eugen Kuksa
abdc8c3bcf5b761e9bebf51e6ba2bce659d29512Eugen KuksatimeOfDayToSeconds :: TimeOfDay -> Int
abdc8c3bcf5b761e9bebf51e6ba2bce659d29512Eugen KuksatimeOfDayToSeconds TimeOfDay { todHour = hours
abdc8c3bcf5b761e9bebf51e6ba2bce659d29512Eugen Kuksa , todMin = minutes
abdc8c3bcf5b761e9bebf51e6ba2bce659d29512Eugen Kuksa , todSec = seconds
abdc8c3bcf5b761e9bebf51e6ba2bce659d29512Eugen Kuksa } =
abdc8c3bcf5b761e9bebf51e6ba2bce659d29512Eugen Kuksa (floor . toDouble) seconds + 60 * (minutes + 60 * hours)
abdc8c3bcf5b761e9bebf51e6ba2bce659d29512Eugen Kuksa where
abdc8c3bcf5b761e9bebf51e6ba2bce659d29512Eugen Kuksa toDouble :: Pico -> Double
abdc8c3bcf5b761e9bebf51e6ba2bce659d29512Eugen Kuksa toDouble s = case readSigned readFloat $ show s of
abdc8c3bcf5b761e9bebf51e6ba2bce659d29512Eugen Kuksa [(x, "")] -> x
abdc8c3bcf5b761e9bebf51e6ba2bce659d29512Eugen Kuksa _ -> error $ "timeOfDayToSeconds: Failed reading the number " ++ show s