From 7cb210fb786e06b3cd89817fc5f1663d0ba9e420 Mon Sep 17 00:00:00 2001 From: rd4com <144297616+rd4com@users.noreply.github.com> Date: Mon, 17 Jun 2024 23:17:07 +0200 Subject: [PATCH 1/2] [Stdlib] Speedup `Dict` (changing modulus to bitshifting) Signed-off-by: rd4com <144297616+rd4com@users.noreply.github.com> --- stdlib/src/collections/dict.mojo | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/stdlib/src/collections/dict.mojo b/stdlib/src/collections/dict.mojo index 8cb3a8e3f..3abc927a4 100644 --- a/stdlib/src/collections/dict.mojo +++ b/stdlib/src/collections/dict.mojo @@ -888,10 +888,10 @@ struct Dict[K: KeyElement, V: CollectionElement]( fn _next_index_slot(self, inout slot: Int, inout perturb: UInt64): alias PERTURB_SHIFT = 5 perturb >>= PERTURB_SHIFT - slot = ((5 * slot) + int(perturb + 1)) % self._reserved() + slot = ((5 * slot) + int(perturb + 1)) & (self._reserved() - 1) fn _find_empty_index(self, hash: Int) -> Int: - var slot = hash % self._reserved() + var slot = hash & (self._reserved() - 1) var perturb = bitcast[DType.uint64](Int64(hash)) while True: var index = self._get_index(slot) @@ -901,7 +901,7 @@ struct Dict[K: KeyElement, V: CollectionElement]( fn _find_index(self, hash: Int, key: K) -> (Bool, Int, Int): # Return (found, slot, index) - var slot = hash % self._reserved() + var slot = hash & (self._reserved() - 1) var perturb = bitcast[DType.uint64](Int64(hash)) while True: var index = self._get_index(slot) From 8f845743ba22d7130ee7495efed6521ccd1abd9a Mon Sep 17 00:00:00 2001 From: rd4com <144297616+rd4com@users.noreply.github.com> Date: Tue, 18 Jun 2024 00:24:46 +0200 Subject: [PATCH 2/2] [Stdlib] Speedup `Dict` (changing modulus to bitshifting) Signed-off-by: rd4com <144297616+rd4com@users.noreply.github.com> --- stdlib/src/collections/dict.mojo | 16 ++++++++-------- 1 file changed, 8 insertions(+), 8 deletions(-) diff --git a/stdlib/src/collections/dict.mojo b/stdlib/src/collections/dict.mojo index 3abc927a4..9568fc149 100644 --- a/stdlib/src/collections/dict.mojo +++ b/stdlib/src/collections/dict.mojo @@ -271,30 +271,30 @@ struct _DictIndex: fn get_index(self, reserved: Int, slot: Int) -> Int: if reserved <= 128: var data = self.data.bitcast[DType.int8]() - return int(Scalar.load(data, slot % reserved)) + return int(Scalar.load(data, slot & (reserved - 1))) elif reserved <= 2**16 - 2: var data = self.data.bitcast[DType.int16]() - return int(Scalar.load(data, slot % reserved)) + return int(Scalar.load(data, slot & (reserved - 1))) elif reserved <= 2**32 - 2: var data = self.data.bitcast[DType.int32]() - return int(Scalar.load(data, slot % reserved)) + return int(Scalar.load(data, slot & (reserved - 1))) else: var data = self.data.bitcast[DType.int64]() - return int(Scalar.load(data, slot % reserved)) + return int(Scalar.load(data, slot & (reserved - 1))) fn set_index(inout self, reserved: Int, slot: Int, value: Int): if reserved <= 128: var data = self.data.bitcast[DType.int8]() - return Scalar.store(data, slot % reserved, value) + return Scalar.store(data, slot & (reserved - 1), value) elif reserved <= 2**16 - 2: var data = self.data.bitcast[DType.int16]() - return Scalar.store(data, slot % reserved, value) + return Scalar.store(data, slot & (reserved - 1), value) elif reserved <= 2**32 - 2: var data = self.data.bitcast[DType.int32]() - return Scalar.store(data, slot % reserved, value) + return Scalar.store(data, slot & (reserved - 1), value) else: var data = self.data.bitcast[DType.int64]() - return Scalar.store(data, slot % reserved, value) + return Scalar.store(data, slot & (reserved - 1), value) fn __del__(owned self): self.data.free()