From a93b837393b788f9f1655e7766a0d254ecaa4452 Mon Sep 17 00:00:00 2001 From: Joey Hess Date: Thu, 29 Sep 2016 14:04:53 -0400 Subject: Optimised git-annex branch log file timestamp parsing. 10% speedup This sped up git annex find --not --in web from 6.64s to 5.69s. The optimised parser is probably more like 50% faster than the general one it replaced. --- Logs/TimeStamp.hs | 25 +++++++++++++++++-------- 1 file changed, 17 insertions(+), 8 deletions(-) (limited to 'Logs') diff --git a/Logs/TimeStamp.hs b/Logs/TimeStamp.hs index 0891f920b..a07b6a66d 100644 --- a/Logs/TimeStamp.hs +++ b/Logs/TimeStamp.hs @@ -1,6 +1,6 @@ {- log timestamp parsing - - - Copyright 2015 Joey Hess + - Copyright 2015-2016 Joey Hess - - Licensed under the GNU GPL version 3 or higher. -} @@ -9,22 +9,31 @@ module Logs.TimeStamp where +import Utility.PartialPrelude +import Utility.Misc + import Data.Time.Clock.POSIX import Data.Time +import Data.Ratio #if ! MIN_VERSION_time(1,5,0) import System.Locale #endif -import Control.Applicative -import Prelude {- Parses how POSIXTime shows itself: "1431286201.113452s" - Also handles the format with no fractional seconds. -} parsePOSIXTime :: String -> Maybe POSIXTime -#if MIN_VERSION_time(1,5,0) -parsePOSIXTime s = utcTimeToPOSIXSeconds <$> parseTimeM True defaultTimeLocale "%s%Qs" s -#else -parsePOSIXTime s = utcTimeToPOSIXSeconds <$> parseTime defaultTimeLocale "%s%Qs" s -#endif +parsePOSIXTime s = do + let (sn, sd) = separate (== '.') s + n <- readi sn + if null sd + then return (fromIntegral n) + else do + d <- readi sd + let r = d % (10 ^ (length sd - 1)) + return (fromIntegral n + fromRational r) + where + readi :: String -> Maybe Integer + readi = readish formatPOSIXTime :: String -> POSIXTime -> String formatPOSIXTime fmt t = formatTime defaultTimeLocale fmt (posixSecondsToUTCTime t) -- cgit v1.2.3