diff options
author | 2017-01-31 18:40:42 -0400 | |
---|---|---|
committer | 2017-01-31 19:06:22 -0400 | |
commit | 7fd21be7f967bdc21530b730f595379b23fe1174 (patch) | |
tree | d2af9101541d8166b2035271967bb3ac01751e36 /Annex | |
parent | 164466c987a7607a5f598b36e5b3111a68bd101f (diff) |
Some optimisations to string splitting code.
Turns out that Data.List.Utils.split is slow and makes a lot of
allocations. Here's a much simpler single character splitter that behaves
the same (even in wacky corner cases) while running in half the time and
75% the allocations.
As well as being an optimisation, this helps move toward eliminating use of
missingh.
(Data.List.Split.splitOn is nearly as slow as Data.List.Utils.split and
allocates even more.)
I have not benchmarked the effect on git-annex, but would not be surprised
to see some parsing of eg, large streams from git commands run twice as
fast, and possibly in less memory.
This commit was sponsored by Boyd Stephen Smith Jr. on Patreon.
Diffstat (limited to 'Annex')
-rw-r--r-- | Annex/Direct.hs | 4 | ||||
-rw-r--r-- | Annex/TaggedPush.hs | 2 |
2 files changed, 3 insertions, 3 deletions
diff --git a/Annex/Direct.hs b/Annex/Direct.hs index 5724d1162..e5c1c47c8 100644 --- a/Annex/Direct.hs +++ b/Annex/Direct.hs @@ -441,7 +441,7 @@ setDirect wantdirect = do - this way things that show HEAD (eg shell prompts) will - hopefully show just "master". -} directBranch :: Ref -> Ref -directBranch orighead = case split "/" $ fromRef orighead of +directBranch orighead = case splitc '/' $ fromRef orighead of ("refs":"heads":"annex":"direct":_) -> orighead ("refs":"heads":rest) -> Ref $ "refs/heads/annex/direct/" ++ intercalate "/" rest @@ -452,7 +452,7 @@ directBranch orighead = case split "/" $ fromRef orighead of - Any other ref is left unchanged. -} fromDirectBranch :: Ref -> Ref -fromDirectBranch directhead = case split "/" $ fromRef directhead of +fromDirectBranch directhead = case splitc '/' $ fromRef directhead of ("refs":"heads":"annex":"direct":rest) -> Ref $ "refs/heads/" ++ intercalate "/" rest _ -> directhead diff --git a/Annex/TaggedPush.hs b/Annex/TaggedPush.hs index ef1aeeea2..3b06170b3 100644 --- a/Annex/TaggedPush.hs +++ b/Annex/TaggedPush.hs @@ -39,7 +39,7 @@ toTaggedBranch u info b = Git.Ref $ intercalate "/" $ catMaybes ] fromTaggedBranch :: Git.Branch -> Maybe (UUID, Maybe String) -fromTaggedBranch b = case split "/" $ Git.fromRef b of +fromTaggedBranch b = case splitc '/' $ Git.fromRef b of ("refs":"synced":u:info:_base) -> Just (toUUID u, fromB64Maybe info) ("refs":"synced":u:_base) -> |