Skip to content

Commit

Permalink
micro-bench: tweak config for WriteBuffer benchmark
Browse files Browse the repository at this point in the history
  • Loading branch information
mheinzel committed May 4, 2024
1 parent df70866 commit fad50a7
Showing 1 changed file with 45 additions and 33 deletions.
78 changes: 45 additions & 33 deletions bench/micro/Bench/Database/LSMTree/Internal/WriteBuffer.hs
Original file line number Diff line number Diff line change
Expand Up @@ -36,64 +36,76 @@ benchmarks :: Benchmark
benchmarks = bgroup "Bench.Database.LSMTree.Internal.WriteBuffer" [
benchWriteBuffer configWord64
{ name = "word64-insert-10k"
, ninserts = 10_000
, nentries = 10_000
, finserts = 1
}
, benchWriteBuffer configWord64
{ name = "word64-delete-10k"
, ndeletes = 10_000
, nentries = 10_000
, fdeletes = 1
}
, benchWriteBuffer configWord64
{ name = "word64-blob-10k"
, nblobinserts = 10_000
, nentries = 10_000
, fblobinserts = 1
}
, benchWriteBuffer configWord64
{ name = "word64-mupsert-10k"
, nmupserts = 10_000
, nentries = 10_000
, fmupserts = 1
-- TODO: too few collisions to really measure resolution
, mappendVal = Just (onDeserialisedValues ((+) @Word64))
}
-- different key and value sizes
, benchWriteBuffer configWord64
{ name = "insert-large-keys-2k" -- large keys
, ninserts = 2_000
, nentries = 2_000
, finserts = 1
, randomKey = first serialiseKey . randomByteStringR (0, 4000)
}
, benchWriteBuffer configWord64
{ name = "insert-mix-2k" -- small and large values
, ninserts = 2_000
, nentries = 2_000
, finserts = 1
, randomValue = first serialiseValue . randomByteStringR (0, 8000)
}
, benchWriteBuffer configWord64
{ name = "insert-page-2k" -- 1 page
, ninserts = 2_000
, nentries = 2_000
, finserts = 1
, randomValue = first serialiseValue . randomByteStringR (4056, 4056)
}
, benchWriteBuffer configWord64
{ name = "insert-page-plus-byte-2k" -- 1 page + 1 byte
, ninserts = 2_000
, nentries = 2_000
, finserts = 1
, randomValue = first serialiseValue . randomByteStringR (4057, 4057)
}
, benchWriteBuffer configWord64
{ name = "insert-huge-2k" -- 3-5 pages
, ninserts = 2_000
, nentries = 2_000
, finserts = 1
, randomValue = first serialiseValue . randomByteStringR (10_000, 20_000)
}
-- UTxO workload
-- compare different buffer sizes to see superlinear cost of map insertion
, benchWriteBuffer configUTxO
{ name = "utxo-2k"
, ninserts = 1_000
, ndeletes = 1_000
, nentries = 2_000
, finserts = 1
, fdeletes = 1
}
, benchWriteBuffer configUTxO
{ name = "utxo-10k"
, ninserts = 5_000
, ndeletes = 5_000
, nentries = 2_000
, finserts = 1
, fdeletes = 1
}
, benchWriteBuffer configUTxO
{ name = "utxo-50k"
, ninserts = 25_000
, ndeletes = 25_000
, nentries = 2_000
, finserts = 1
, fdeletes = 1
}
]

Expand Down Expand Up @@ -177,25 +189,27 @@ data Config = Config {
-- | Name for the benchmark scenario described by this config.
name :: !String
-- | Number of key\/operation pairs in the run
, ninserts :: !Int
, nblobinserts :: !Int
, ndeletes :: !Int
, nmupserts :: !Int
, nentries :: !Int
, finserts :: !Int
, fblobinserts :: !Int
, fdeletes :: !Int
, fmupserts :: !Int
, randomKey :: Rnd SerialisedKey
, randomValue :: Rnd SerialisedValue
, randomBlob :: Rnd SerialisedBlob
, mappendVal :: Maybe Mappend
, mappendVal :: !(Maybe Mappend)
}

type Rnd a = StdGen -> (a, StdGen)

defaultConfig :: Config
defaultConfig = Config {
name = "default"
, ninserts = 0
, nblobinserts = 0
, ndeletes = 0
, nmupserts = 0
, nentries = 0
, finserts = 0
, fblobinserts = 0
, fdeletes = 0
, fmupserts = 0
, randomKey = error "randomKey not implemented"
, randomValue = error "randomValue not implemented"
, randomBlob = error "randomBlob not implemented"
Expand Down Expand Up @@ -224,7 +238,7 @@ writeBufferEnv ::
writeBufferEnv config = do
sysTmpDir <- getCanonicalTemporaryDirectory
benchTmpDir <- createTempDirectory sysTmpDir "writeBufferEnv"
let kops = lookupsEnv config (mkStdGen 17)
let kops = randomKOps config (mkStdGen 17)
let inputKOps = case mappendVal config of
Nothing -> NormalInputs (fmap (fmap expectNormal) kops)
Just f -> MonoidalInputs (fmap (fmap expectMonoidal) kops) f
Expand All @@ -247,34 +261,32 @@ writeBufferEnvCleanup (tmpDir, _, _) = do

-- | Generate keys and entries to insert into the write buffer.
-- They are already serialised to exclude the cost from the benchmark.
lookupsEnv ::
randomKOps ::
Config
-> StdGen -- ^ RNG
-> [SerialisedKOp]
lookupsEnv Config {..} = take nentries . List.unfoldr (Just . randomKOp)
randomKOps Config {..} = take nentries . List.unfoldr (Just . randomKOp)
where
nentries = ninserts + nblobinserts + ndeletes + nmupserts

randomKOp :: Rnd SerialisedKOp
randomKOp g = let (!k, !g') = randomKey g
(!e, !g'') = randomEntry g'
in ((k, e), g'')

randomEntry :: Rnd SerialisedEntry
randomEntry = frequency
[ ( ninserts
[ ( finserts
, \g -> let (!v, !g') = randomValue g
in (Insert v, g')
)
, ( nblobinserts
, ( fblobinserts
, \g -> let (!v, !g') = randomValue g
(!b, !g'') = randomBlob g'
in (InsertWithBlob v b, g'')
)
, ( ndeletes
, ( fdeletes
, \g -> (Delete, g)
)
, ( nmupserts
, ( fmupserts
, \g -> let (!v, !g') = randomValue g
in (Mupdate v, g')
)
Expand Down

0 comments on commit fad50a7

Please sign in to comment.