From 53f5c2cb5282a857dd1a8e78038d6d5d65b078b0 Mon Sep 17 00:00:00 2001 From: Slamakans Date: Wed, 5 Oct 2016 00:53:26 +0200 Subject: [PATCH] Cache array and keyArray in Collection (#771) * Cache array and keyArray in Collection Cache array and keyArray in the Collection class to improve consecutive calls of collection.random() by around 400,000%, I think lel. The speed decrease (I assume) compared to the previous version when calling after it has changed is most likely negligible. * Fix for ESLint I think this fixes it. --- src/util/Collection.js | 24 ++++++++++++++++++++---- 1 file changed, 20 insertions(+), 4 deletions(-) diff --git a/src/util/Collection.js b/src/util/Collection.js index 70b29b9c2..e40d93396 100644 --- a/src/util/Collection.js +++ b/src/util/Collection.js @@ -3,6 +3,16 @@ * @extends {Map} */ class Collection extends Map { + set(key, value) { + super.set(key, value); + this.changed = true; + } + + delete(key) { + super.delete(key); + this.changed = true; + } + /** * Returns an ordered array of the values of this collection. * @returns {Array} @@ -67,8 +77,11 @@ class Collection extends Map { * @returns {*} */ random() { - const arr = this.array(); - return arr[Math.floor(Math.random() * arr.length)]; + if (!this.cachedArray || this.cachedArray.length !== this.size || this.changed) { + this.cachedArray = this.array(); + this.changed = false; + } + return this.cachedArray[Math.floor(Math.random() * this.cachedArray.length)]; } /** @@ -77,8 +90,11 @@ class Collection extends Map { * @returns {*} */ randomKey() { - const arr = this.keyArray(); - return arr[Math.floor(Math.random() * arr.length)]; + if (!this.cachedKeyArray || this.cachedKeyArray.length !== this.size || this.changed) { + this.cachedKeyArray = this.keyArray(); + this.changed = false; + } + return this.cachedKeyArray[Math.floor(Math.random() * this.cachedKeyArray.length)]; } /**