From 486e8834d61c6ba0668413da655dfa02d820f182 Mon Sep 17 00:00:00 2001 From: DBotThePony Date: Sat, 17 Feb 2024 23:43:39 +0700 Subject: [PATCH] Faster free bitmap search --- .../ru/dbotthepony/kommons/io/BTreeDB6.kt | 37 ++++++------------- 1 file changed, 12 insertions(+), 25 deletions(-) diff --git a/src/main/kotlin/ru/dbotthepony/kommons/io/BTreeDB6.kt b/src/main/kotlin/ru/dbotthepony/kommons/io/BTreeDB6.kt index d4783d0..5a403db 100644 --- a/src/main/kotlin/ru/dbotthepony/kommons/io/BTreeDB6.kt +++ b/src/main/kotlin/ru/dbotthepony/kommons/io/BTreeDB6.kt @@ -5,7 +5,6 @@ import it.unimi.dsi.fastutil.ints.IntArraySet import it.unimi.dsi.fastutil.ints.IntOpenHashSet import it.unimi.dsi.fastutil.objects.Object2IntAVLTreeMap import it.unimi.dsi.fastutil.objects.ObjectArrayList -import it.unimi.dsi.fastutil.objects.ObjectArraySet import it.unimi.dsi.fastutil.objects.ObjectOpenHashSet import ru.dbotthepony.kommons.util.CarriedExecutor import ru.dbotthepony.kommons.util.KOptional @@ -451,23 +450,16 @@ class BTreeDB6 private constructor(override val file: File, private var reader: return result } - if (after != INVALID_BLOCK_INDEX) { + if (after != INVALID_BLOCK_INDEX && !occupiedBlocksBitmap[after + 1]) { // if we can allocate enough blocks after specified index, allocate there (reduce fragmentation) - var correct = true + val findOccupied = occupiedBlocksBitmap.nextSetBit(after + 1) val find = after + 1 - for (i2 in 0 until size) { - if (occupiedBlocksBitmap[i2 + find]) { - correct = false - break - } - } - - if (correct) { + if (findOccupied == -1 || findOccupied - find >= size) { val blocks = ArrayList(size) + occupiedBlocksBitmap.set(find, find + size) for (i2 in 0 until size) { - occupiedBlocksBitmap[i2 + find] = true val block = Block(i2 + find) block.nextBlock = INVALID_BLOCK_INDEX block.type = type @@ -482,29 +474,24 @@ class BTreeDB6 private constructor(override val file: File, private var reader: var i = 0 while (true) { - val find = occupiedBlocksBitmap.nextClearBit(i) - var correct = true + val findFree = occupiedBlocksBitmap.nextClearBit(i) + val findOccupied = occupiedBlocksBitmap.nextSetBit(findFree) - for (i2 in 0 until size) { - if (occupiedBlocksBitmap[i2 + find]) { - correct = false - i = find + i2 + 1 - break - } - } - - if (correct) { + if (findOccupied == -1 || findOccupied - findFree >= size) { val blocks = ArrayList(size) + occupiedBlocksBitmap.set(findFree, findFree + size) + for (i2 in 0 until size) { - occupiedBlocksBitmap[i2 + find] = true - val block = Block(i2 + find) + val block = Block(i2 + findFree) block.nextBlock = INVALID_BLOCK_INDEX block.type = type blocks.add(block) } return blocks + } else { + i = findOccupied + 1 } } }