5c960601aa
I want this as fast as possible, so it can be added to code paths without slowing them down. Avoid the set lookup, and rely on laziness, drops runtime from 14.37 ns to 11.03 ns according to this criterion benchmark: import Criterion.Main import qualified Types.Difference as New import qualified Types.DifferenceOld as Old main :: IO () main = defaultMain [ bgroup "hasDifference" [ bench "new" $ whnf (New.hasDifference New.OneLevelObjectHash) new , bench "old" $ whnf (Old.hasDifference Old.OneLevelObjectHash) old ] ] where s = "fromList [ObjectHashLower, OneLevelObjectHash, OneLevelBranchHash]" new = New.readDifferences s old = Old.readDifferences s A little bit of added boilerplate, but I suppose it's worth it to not need to worry about set lookup overhead. Note that adding more differences would slow down the old implementation; the new implementation will run the same speed.
40 lines
1.2 KiB
Haskell
40 lines
1.2 KiB
Haskell
{- git-annex difference log
|
|
-
|
|
- Copyright 2015 Joey Hess <id@joeyh.name>
|
|
-
|
|
- Licensed under the GNU GPL version 3 or higher.
|
|
-}
|
|
|
|
module Logs.Difference (
|
|
recordDifferences,
|
|
recordedDifferences,
|
|
recordedDifferencesFor,
|
|
module Logs.Difference.Pure
|
|
) where
|
|
|
|
import Data.Time.Clock.POSIX
|
|
import qualified Data.Map as M
|
|
|
|
import Common.Annex
|
|
import Types.Difference
|
|
import qualified Annex.Branch
|
|
import Logs
|
|
import Logs.UUIDBased
|
|
import Logs.Difference.Pure
|
|
|
|
recordDifferences :: Differences -> UUID -> Annex ()
|
|
recordDifferences ds@(Differences {}) uuid = do
|
|
ts <- liftIO getPOSIXTime
|
|
Annex.Branch.change differenceLog $
|
|
showLog id . changeLog ts uuid (showDifferences ds) . parseLog Just
|
|
recordDifferences UnknownDifferences _ = return ()
|
|
|
|
-- Map of UUIDs that have Differences recorded.
|
|
-- If a new version of git-annex has added a Difference this version
|
|
-- doesn't know about, it will contain UnknownDifferences.
|
|
recordedDifferences :: Annex (M.Map UUID Differences)
|
|
recordedDifferences = parseDifferencesLog <$> Annex.Branch.get differenceLog
|
|
|
|
recordedDifferencesFor :: UUID -> Annex Differences
|
|
recordedDifferencesFor u = fromMaybe mempty . M.lookup u
|
|
<$> recordedDifferences
|