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.
This commit is contained in:
Joey Hess 2016-09-29 14:04:53 -04:00
parent 3e7218b220
commit 7cae6c746c
No known key found for this signature in database
GPG key ID: C910D9222512E3C7
2 changed files with 18 additions and 8 deletions

View file

@ -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 <id@joeyh.name> Mon, 26 Sep 2016 16:46:19 -0400

View file

@ -1,6 +1,6 @@
{- log timestamp parsing
-
- Copyright 2015 Joey Hess <id@joeyh.name>
- Copyright 2015-2016 Joey Hess <id@joeyh.name>
-
- 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)