convert Key to ShortByteString
This adds the overhead of a copy when serializing and deserializing keys. I have not benchmarked much, but runtimes seem barely changed at all by that. When a lot of keys are in memory, it improves memory use. And, it prevents keys sometimes getting PINNED in memory and failing to GC, which is a problem ByteString has sometimes. In particular, git-annex sync from a borg special remote had that problem and this improved its memory use by a large amount. Sponsored-by: Shae Erisson on Patreon
This commit is contained in:
parent
012b71e471
commit
19e78816f0
15 changed files with 65 additions and 36 deletions
|
@ -20,6 +20,7 @@ import Utility.Metered
|
|||
import qualified Utility.SimpleProtocol as Proto
|
||||
|
||||
import qualified Data.ByteString as S
|
||||
import qualified Data.ByteString.Short as S (toShort, fromShort)
|
||||
import qualified Data.Map.Strict as M
|
||||
import Data.Char
|
||||
import Control.Concurrent
|
||||
|
@ -285,7 +286,7 @@ toProtoKey k = ProtoKey $ alterKey k $ \d -> d
|
|||
-- The extension can be easily removed, because the protocol
|
||||
-- documentation does not allow '.' to be used in the keyName,
|
||||
-- so the first one is the extension.
|
||||
{ keyName = S.takeWhile (/= dot) (keyName d)
|
||||
{ keyName = S.toShort (S.takeWhile (/= dot) (S.fromShort (keyName d)))
|
||||
, keyVariety = setHasExt (HasExt False) (keyVariety d)
|
||||
}
|
||||
where
|
||||
|
|
Loading…
Add table
Add a link
Reference in a new issue