[commit: packages/time] master: RULES for realToFrac, for speed, contributed by Liyang HU <haskell.org at liyang.hu> (8eee78e)
git at git.haskell.org
git at git.haskell.org
Sun Dec 20 07:53:41 UTC 2015
Repository : ssh://git@git.haskell.org/time
On branch : master
Link : http://git.haskell.org/packages/time.git/commitdiff/8eee78e5d4de47651bb837adb28f3550e0611a52
>---------------------------------------------------------------
commit 8eee78e5d4de47651bb837adb28f3550e0611a52
Author: Ashley Yakeley <ashley at semantic.org>
Date: Sun Oct 30 17:38:00 2011 -0700
RULES for realToFrac, for speed, contributed by Liyang HU <haskell.org at liyang.hu>
Ignore-this: c277f94b61ec0c6eab64c1770478220b
darcs-hash:20111031003800-ac6dd-affc63c79ba1478a0ebe610bdd42772a7fd85d86
>---------------------------------------------------------------
8eee78e5d4de47651bb837adb28f3550e0611a52
Data/Time/Clock/Scale.hs | 6 ++++++
Data/Time/Clock/UTC.hs | 9 +++++++++
test/Makefile | 10 +++++++---
test/RealToFracBenchmark.hs | 22 ++++++++++++++++++++++
time.cabal | 2 +-
5 files changed, 45 insertions(+), 4 deletions(-)
diff --git a/Data/Time/Clock/Scale.hs b/Data/Time/Clock/Scale.hs
index 37c3f32..ffa52a2 100644
--- a/Data/Time/Clock/Scale.hs
+++ b/Data/Time/Clock/Scale.hs
@@ -106,3 +106,9 @@ secondsToDiffTime = fromInteger
-- | Create a 'DiffTime' from a number of picoseconds.
picosecondsToDiffTime :: Integer -> DiffTime
picosecondsToDiffTime x = fromRational (x % 1000000000000)
+
+{-# RULES
+"realToFrac/DiffTime->Pico" realToFrac = \ (MkDiffTime ps) -> ps
+"realToFrac/Pico->DiffTime" realToFrac = MkDiffTime
+ #-}
+
diff --git a/Data/Time/Clock/UTC.hs b/Data/Time/Clock/UTC.hs
index e172b15..4f3c23a 100644
--- a/Data/Time/Clock/UTC.hs
+++ b/Data/Time/Clock/UTC.hs
@@ -118,3 +118,12 @@ instance RealFrac NominalDiffTime where
round (MkNominalDiffTime a) = round a
ceiling (MkNominalDiffTime a) = ceiling a
floor (MkNominalDiffTime a) = floor a
+
+{-# RULES
+"realToFrac/DiffTime->NominalDiffTime" realToFrac = \ dt -> MkNominalDiffTime (realToFrac dt)
+"realToFrac/NominalDiffTime->DiffTime" realToFrac = \ (MkNominalDiffTime ps) -> realToFrac ps
+
+"realToFrac/NominalDiffTime->Pico" realToFrac = \ (MkNominalDiffTime ps) -> ps
+"realToFrac/Pico->NominalDiffTime" realToFrac = MkNominalDiffTime
+ #-}
+
diff --git a/test/Makefile b/test/Makefile
index f8ef07d..ca57f7d 100644
--- a/test/Makefile
+++ b/test/Makefile
@@ -52,6 +52,9 @@ TimeZone.ref: FORCE
TestParseTime: TestParseTime.o
$(GHC) $(GHCFLAGS) $^ -o $@
+RealToFracBenchmark: RealToFracBenchmark.o
+ $(GHC) $(GHCFLAGS) $^ -o $@
+
test: \
TestMonthDay.diff \
ConvertBack.diff0 \
@@ -64,13 +67,14 @@ test: \
TestFormat.diff0 \
TestParseDAT.diff \
TestEaster.diff \
- TestParseTime.run \
- UseCases.o
+ TestParseTime.run \
+ UseCases.o \
+ RealToFracBenchmark.run
@echo "Success!"
clean:
rm -rf TestMonthDay ConvertBack TestCalendars TestTime LongWeekYears ClipDates \
- AddDays TestFormat TestParseDAT TestEaster CurrentTime ShowDST TimeZone TimeZone.ref TestParseTime \
+ AddDays TestFormat TestParseDAT TestEaster CurrentTime ShowDST TimeZone TimeZone.ref TestParseTime RealToFracBenchmark \
*.out *.run *.o *.hi Makefile.bak
%.diff: %.ref %.out
diff --git a/test/RealToFracBenchmark.hs b/test/RealToFracBenchmark.hs
new file mode 100644
index 0000000..be4eae2
--- /dev/null
+++ b/test/RealToFracBenchmark.hs
@@ -0,0 +1,22 @@
+{- Contributed by Liyang HU <haskell.org at liyang.hu> -}
+module Main where
+
+import Prelude
+import Control.Applicative
+import Control.Monad
+import Control.DeepSeq
+import Data.Time
+import Data.Time.Clock.POSIX
+import System.Random
+
+main :: IO ()
+main = do
+ ts <- replicateM 100000 $ do
+ t <- posixSecondsToUTCTime . realToFrac <$>
+ ( (*) . fromInteger <$> randomRIO (-15*10^21, 15*10^21) <*>
+ randomIO :: IO Double ) :: IO UTCTime
+ rnf t `seq` return t
+ now <- getCurrentTime
+ print . sum $ map (diffUTCTime now) ts
+ print =<< flip diffUTCTime now <$> getCurrentTime
+
diff --git a/time.cabal b/time.cabal
index 7acb243..cadeea7 100644
--- a/time.cabal
+++ b/time.cabal
@@ -1,5 +1,5 @@
name: time
-version: 1.4
+version: 1.4.0.1
stability: stable
license: BSD3
license-file: LICENSE
More information about the ghc-commits
mailing list