From a369ef27886fc48624238f1a189e55f770f422b1 Mon Sep 17 00:00:00 2001 From: qeled Date: Thu, 10 Dec 2015 02:26:30 +0300 Subject: [PATCH] Improve Cache class performance Use hashmap instead of array for caching by discriminator Optimize `get` method by using `for` loop instead of `forEach` and returning hashmap cache for queries by discriminator --- src/Client/InternalClient.js | 10 -------- src/Structures/Server.js | 4 --- src/Util/Cache.js | 50 +++++++++++++++--------------------- 3 files changed, 20 insertions(+), 44 deletions(-) diff --git a/src/Client/InternalClient.js b/src/Client/InternalClient.js index 594beb2bc..21dd463d6 100644 --- a/src/Client/InternalClient.js +++ b/src/Client/InternalClient.js @@ -1076,11 +1076,6 @@ export default class InternalClient { var startTime = Date.now(); self.intervals.kai = setInterval(() => self.sendWS({ op: 1, d: Date.now() }), data.heartbeat_interval); - self.users.setHighPerformance(); - self.servers.setHighPerformance(); - self.channels.setHighPerformance(); - self.private_channels.setHighPerformance(); - self.user = self.users.add(new User(data.user, client)); data.guilds.forEach(server => { self.servers.add(new Server(server, client)); @@ -1090,11 +1085,6 @@ export default class InternalClient { }); self.state = ConnectionState.READY; - self.users.setNormalPerformance(); - self.servers.setNormalPerformance(); - self.channels.setNormalPerformance(); - self.private_channels.setNormalPerformance(); - client.emit("ready"); client.emit("debug", `ready packet took ${Date.now() - startTime}ms to process`); client.emit("debug", `ready with ${self.servers.length} servers, ${self.channels.length} channels and ${self.users.length} users cached.`); diff --git a/src/Structures/Server.js b/src/Structures/Server.js index b5dd5aa89..df8157d02 100644 --- a/src/Structures/Server.js +++ b/src/Structures/Server.js @@ -33,8 +33,6 @@ export default class Server extends Equality { this.afkChannelID = data.afk_channel_id; this.memberMap = {}; - this.members.setHighPerformance(); - var self = this; data.roles.forEach((dataRole) => { @@ -71,8 +69,6 @@ export default class Server extends Equality { } } } - - this.members.setNormalPerformance(); } detailsOf(user) { diff --git a/src/Util/Cache.js b/src/Util/Cache.js index 4ca19292c..4d89ef284 100644 --- a/src/Util/Cache.js +++ b/src/Util/Cache.js @@ -4,28 +4,18 @@ export default class Cache extends Array { constructor(discrim, limit) { super(); this.discrim = discrim || "id"; - this.discrimCache = []; - this.highPerformance = false; - } - - setHighPerformance() { - this.highPerformance = true; - } - - setNormalPerformance() { - this.discrimCache = []; - this.highPerformance = false; + this.discrimCache = {}; } get(key, value) { - var found = null; - this.forEach((val, index, array) => { - if (val[key] == value) { - found = val; - return; - } - }); - return found; + if (key === this.discrim) + return this.discrimCache[value] || null; + + var l = this.length; + for (var i = 0; i < l; i++) + if (this[i][key] == value) + return this[i]; + return null; } has(object) { @@ -44,18 +34,16 @@ export default class Cache extends Array { } add(data) { - var exit = false; - exit = ~this.discrimCache.indexOf(data[this.discrim]); - if (exit) { - return data; - } else { - if (this.limit && this.length >= this.limit) { - this.splice(0, 1); - } - this.push(data); - this.discrimCache.push(data[this.discrim]); - return data; + var cacheKey = this.discrim === "id" ? data.id : data[this.discrim]; + if (this.discrimCache[cacheKey]) { + return this.discrimCache[cacheKey]; } + if (this.limit && this.length >= this.limit) { + this.splice(0, 1); + } + this.push(data); + this.discrimCache[cacheKey] = data; + return data; } update(old, data) { @@ -63,6 +51,7 @@ export default class Cache extends Array { if (item) { var index = this.indexOf(item); this[index] = data; + this.discrimCache[data[this.discrim]] = data; return this[index]; } else { return false; @@ -74,6 +63,7 @@ export default class Cache extends Array { } remove(data) { + delete this.discrimCache[data[this.discrim]]; var index = this.indexOf(data); if (~index) { this.splice(index, 1);