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. --- CHANGELOG | 1 + Logs/TimeStamp.hs | 25 +++++++++++++++++-------- 2 files changed, 18 insertions(+), 8 deletions(-) diff --git a/CHANGELOG b/CHANGELOG index 71f53793a..e94c1b0b3 100644 --- a/CHANGELOG +++ b/CHANGELOG @@ -5,6 +5,7 @@ git-annex (6.20160924) UNRELEASED; urgency=medium * Optimisations to git-annex branch query and setting, avoiding repeated copies of the environment. Speeds up commands like "git-annex find --in remote" by over 50%. + * Optimised git-annex branch log file timestamp parsing. -- Joey Hess Mon, 26 Sep 2016 16:46:19 -0400 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