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 * Optimisations to git-annex branch query and setting, avoiding repeated
copies of the environment. Speeds up commands like copies of the environment. Speeds up commands like
"git-annex find --in remote" by over 50%. "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 -- Joey Hess <id@joeyh.name> Mon, 26 Sep 2016 16:46:19 -0400

View file

@ -1,6 +1,6 @@
{- log timestamp parsing {- 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. - Licensed under the GNU GPL version 3 or higher.
-} -}
@ -9,22 +9,31 @@
module Logs.TimeStamp where module Logs.TimeStamp where
import Utility.PartialPrelude
import Utility.Misc
import Data.Time.Clock.POSIX import Data.Time.Clock.POSIX
import Data.Time import Data.Time
import Data.Ratio
#if ! MIN_VERSION_time(1,5,0) #if ! MIN_VERSION_time(1,5,0)
import System.Locale import System.Locale
#endif #endif
import Control.Applicative
import Prelude
{- Parses how POSIXTime shows itself: "1431286201.113452s" {- Parses how POSIXTime shows itself: "1431286201.113452s"
- Also handles the format with no fractional seconds. -} - Also handles the format with no fractional seconds. -}
parsePOSIXTime :: String -> Maybe POSIXTime parsePOSIXTime :: String -> Maybe POSIXTime
#if MIN_VERSION_time(1,5,0) parsePOSIXTime s = do
parsePOSIXTime s = utcTimeToPOSIXSeconds <$> parseTimeM True defaultTimeLocale "%s%Qs" s let (sn, sd) = separate (== '.') s
#else n <- readi sn
parsePOSIXTime s = utcTimeToPOSIXSeconds <$> parseTime defaultTimeLocale "%s%Qs" s if null sd
#endif 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 :: String -> POSIXTime -> String
formatPOSIXTime fmt t = formatTime defaultTimeLocale fmt (posixSecondsToUTCTime t) formatPOSIXTime fmt t = formatTime defaultTimeLocale fmt (posixSecondsToUTCTime t)