From 2857a3f9ef6296168ebad0d9e2e0fcc5f71b1a19 Mon Sep 17 00:00:00 2001 From: DBotThePony Date: Tue, 22 Nov 2022 16:12:51 +0700 Subject: [PATCH] Long hash map somehow is ~4 times faster than AVL tree map --- .../mc/otm/block/entity/SynchronizedBlockEntity.kt | 7 ++++--- 1 file changed, 4 insertions(+), 3 deletions(-) diff --git a/src/main/kotlin/ru/dbotthepony/mc/otm/block/entity/SynchronizedBlockEntity.kt b/src/main/kotlin/ru/dbotthepony/mc/otm/block/entity/SynchronizedBlockEntity.kt index 9c9b7245a..96b89dac0 100644 --- a/src/main/kotlin/ru/dbotthepony/mc/otm/block/entity/SynchronizedBlockEntity.kt +++ b/src/main/kotlin/ru/dbotthepony/mc/otm/block/entity/SynchronizedBlockEntity.kt @@ -2,6 +2,7 @@ package ru.dbotthepony.mc.otm.block.entity import it.unimi.dsi.fastutil.longs.Long2ObjectAVLTreeMap import it.unimi.dsi.fastutil.longs.Long2ObjectFunction +import it.unimi.dsi.fastutil.longs.Long2ObjectOpenHashMap import net.minecraft.core.BlockPos import net.minecraft.server.level.ServerLevel import net.minecraft.server.level.ServerPlayer @@ -92,7 +93,7 @@ abstract class SynchronizedBlockEntity(p_155228_: BlockEntityType<*>, p_155229_: unsubscribe() val subs = playerMap - .computeIfAbsent(level) { Long2ObjectAVLTreeMap() } + .computeIfAbsent(level) { Long2ObjectOpenHashMap() } .computeIfAbsent(ChunkPos(blockPos).toLong(), Long2ObjectFunction { ChunkSubscribers(level = WeakReference(level), chunkPos = ChunkPos(blockPos).toLong()) }) subs.subscribe(this) @@ -276,7 +277,7 @@ abstract class SynchronizedBlockEntity(p_155228_: BlockEntityType<*>, p_155229_: * [net.minecraft.server.level.ChunkMap.getPlayers], which is not something we want */ companion object { - private val playerMap = WeakHashMap>() + private val playerMap = WeakHashMap>() private val tickingMap = WeakHashMap>>() fun onLevelUnload(event: LevelEvent.Unload) { @@ -331,7 +332,7 @@ abstract class SynchronizedBlockEntity(p_155228_: BlockEntityType<*>, p_155229_: } fun onWatch(event: ChunkWatchEvent.Watch) { - playerMap.computeIfAbsent(event.level) { Long2ObjectAVLTreeMap() }.computeIfAbsent(event.pos.toLong(), Long2ObjectFunction { ChunkSubscribers(level = WeakReference(event.level), chunkPos = event.pos.toLong()) }).let { + playerMap.computeIfAbsent(event.level) { Long2ObjectOpenHashMap() }.computeIfAbsent(event.pos.toLong(), Long2ObjectFunction { ChunkSubscribers(level = WeakReference(event.level), chunkPos = event.pos.toLong()) }).let { val (blocks, players) = it if (event.player !in players) {