From 8ab1fd9707f2a6bb306842841140c7cf04933d03 Mon Sep 17 00:00:00 2001 From: Oh64 Date: Fri, 27 Mar 2026 20:00:54 +0100 Subject: [PATCH] use arrayGroupBy, include group time in query traces --- src/gateway/opcodes/Identify.ts | 71 +++++++++++---------------------- src/util/util/ElapsedTime.ts | 4 ++ 2 files changed, 28 insertions(+), 47 deletions(-) diff --git a/src/gateway/opcodes/Identify.ts b/src/gateway/opcodes/Identify.ts index 3aa91b9fb..ec4d195ec 100644 --- a/src/gateway/opcodes/Identify.ts +++ b/src/gateway/opcodes/Identify.ts @@ -18,6 +18,7 @@ import { Capabilities, CLOSECODES, OPCODES, Payload, Send, setupListener, WebSocket } from "@spacebar/gateway"; import { + arrayGroupBy, Application, Channel, checkToken, @@ -368,43 +369,19 @@ export async function onIdentify(this: WebSocket, data: Payload) { const allThreads = allThreadsRaw.filter(({ thread_metadata }) => thread_metadata?.archived === false); const threadMemberMap = new Map(threadMembers.map((member) => [member.id, member] as const)); - const channelsByGuild = new Map(); - const emojisByGuild = new Map(); - const rolesByGuild = new Map(); - const stickersByGuild = new Map(); - const voiceStatesByGuild = new Map(); - const threadsByGuild = new Map(); + const { result: channelsByGuild, elapsed: groupChannelsTime } = timeFunction(() => arrayGroupBy(memberGuildChannels, (c) => c.guild_id!)); + const { result: emojisByGuild, elapsed: groupEmojisTime } = timeFunction(() => arrayGroupBy(memberGuildEmojis, (e) => e.guild_id!)); + const { result: rolesByGuild, elapsed: groupRolesTime } = timeFunction(() => arrayGroupBy(memberGuildRoles, (r) => r.guild_id!)); + const { result: stickersByGuild, elapsed: groupStickersTime } = timeFunction(() => arrayGroupBy(memberGuildStickers, (s) => s.guild_id!)); + const { result: voiceStatesByGuild, elapsed: groupVoiceStatesTime } = timeFunction(() => arrayGroupBy(memberGuildVoiceStates, (v) => v.guild_id!)); + const { result: threadsByGuild, elapsed: groupThreadsTime } = timeFunction(() => arrayGroupBy(allThreads, (t) => t.guild_id!)); - for (const c of memberGuildChannels) { - const arr = channelsByGuild.get(c.guild_id!); - if (arr) arr.push(c); - else channelsByGuild.set(c.guild_id!, [c]); - } - for (const e of memberGuildEmojis) { - const arr = emojisByGuild.get(e.guild_id!); - if (arr) arr.push(e); - else emojisByGuild.set(e.guild_id!, [e]); - } - for (const r of memberGuildRoles) { - const arr = rolesByGuild.get(r.guild_id!); - if (arr) arr.push(r); - else rolesByGuild.set(r.guild_id!, [r]); - } - for (const s of memberGuildStickers) { - const arr = stickersByGuild.get(s.guild_id!); - if (arr) arr.push(s); - else stickersByGuild.set(s.guild_id!, [s]); - } - for (const v of memberGuildVoiceStates) { - const arr = voiceStatesByGuild.get(v.guild_id!); - if (arr) arr.push(v); - else voiceStatesByGuild.set(v.guild_id!, [v]); - } - for (const t of allThreads) { - const arr = threadsByGuild.get(t.guild_id!); - if (arr) arr.push(t); - else threadsByGuild.set(t.guild_id!, [t]); - } + const queryGuildChannelsTimeTotal = queryGuildChannelsTime.add(groupChannelsTime); + const queryGuildEmojisTimeTotal = queryGuildEmojisTime.add(groupEmojisTime); + const queryGuildRolesTimeTotal = queryGuildRolesTime.add(groupRolesTime); + const queryGuildStickersTimeTotal = queryGuildStickersTime.add(groupStickersTime); + const queryGuildVoiceStatesTimeTotal = queryGuildVoiceStatesTime.add(groupVoiceStatesTime); + const queryThreadsTimeTotal = queryThreadsTime.add(groupThreadsTime); const guildMap = new Map(memberGuilds.map((g) => [g.id, g])); @@ -427,19 +404,19 @@ export async function onIdentify(this: WebSocket, data: Payload) { trace.calls.push("findGuild", { micros: sw.getElapsedAndReset().totalMicroseconds }); g.channels = channelsByGuild.get(m.guild_id) ?? []; - trace.calls.push(`filterChannels(${g.channels.length}/${memberGuildChannels.length})`, { micros: sw.getElapsedAndReset().totalMicroseconds }); + trace.calls.push(`getChannels(${g.channels.length}/${memberGuildChannels.length})`, { micros: sw.getElapsedAndReset().totalMicroseconds }); g.emojis = emojisByGuild.get(m.guild_id) ?? []; - trace.calls.push(`filterEmojis(${g.emojis.length}/${memberGuildEmojis.length})`, { micros: sw.getElapsedAndReset().totalMicroseconds }); + trace.calls.push(`getEmojis(${g.emojis.length}/${memberGuildEmojis.length})`, { micros: sw.getElapsedAndReset().totalMicroseconds }); g.roles = rolesByGuild.get(m.guild_id) ?? []; - trace.calls.push(`filterRoles(${g.roles.length}/${memberGuildRoles.length})`, { micros: sw.getElapsedAndReset().totalMicroseconds }); + trace.calls.push(`getRoles(${g.roles.length}/${memberGuildRoles.length})`, { micros: sw.getElapsedAndReset().totalMicroseconds }); g.stickers = stickersByGuild.get(m.guild_id) ?? []; - trace.calls.push(`filterStickers(${g.stickers.length}/${memberGuildStickers.length})`, { micros: sw.getElapsedAndReset().totalMicroseconds }); + trace.calls.push(`getStickers(${g.stickers.length}/${memberGuildStickers.length})`, { micros: sw.getElapsedAndReset().totalMicroseconds }); g.voice_states = voiceStatesByGuild.get(m.guild_id) ?? []; - trace.calls.push(`filterVoiceStates(${g.voice_states.length}/${memberGuildVoiceStates.length})`, { micros: sw.getElapsedAndReset().totalMicroseconds }); + trace.calls.push(`getVoiceStates(${g.voice_states.length}/${memberGuildVoiceStates.length})`, { micros: sw.getElapsedAndReset().totalMicroseconds }); trace.micros = totalSw.elapsed().totalMicroseconds; mergeMemberGuildsTrace.calls!.push(`guild_${m.guild_id}`, trace); @@ -777,13 +754,13 @@ export async function onIdentify(this: WebSocket, data: Payload) { } else if (key === "guildRelationQueryTime") { val.calls = []; for (const [subkey, subvalue] of Object.entries({ - queryGuildChannelsTime, - queryGuildEmojisTime, - queryGuildRolesTime, - queryGuildStickersTime, - queryGuildVoiceStatesTime, + queryGuildChannelsTime: queryGuildChannelsTimeTotal, + queryGuildEmojisTime: queryGuildEmojisTimeTotal, + queryGuildRolesTime: queryGuildRolesTimeTotal, + queryGuildStickersTime: queryGuildStickersTimeTotal, + queryGuildVoiceStatesTime: queryGuildVoiceStatesTimeTotal, threadMemberTime, - queryThreadsTime, + queryThreadsTime: queryThreadsTimeTotal, })) { if (subvalue) { val.calls.push(subkey, { diff --git a/src/util/util/ElapsedTime.ts b/src/util/util/ElapsedTime.ts index cce91280f..5233ff346 100644 --- a/src/util/util/ElapsedTime.ts +++ b/src/util/util/ElapsedTime.ts @@ -69,6 +69,10 @@ export class ElapsedTime { return this.totalDays; } + add(other: ElapsedTime): ElapsedTime { + return new ElapsedTime(this.timeNanos + other.totalNanoseconds); + } + toString(): string { // Format: "DD.HH:MM:SS.mmmuuuNNN", with days being optional const daysPart = Math.floor(this.days) > 0 ? `${Math.floor(this.days)}.` : "";