diff --git a/spec/unit/room.spec.ts b/spec/unit/room.spec.ts index 542bbcb2536..37b5c15048d 100644 --- a/spec/unit/room.spec.ts +++ b/spec/unit/room.spec.ts @@ -1394,6 +1394,22 @@ describe("Room", function () { expect(name).toEqual(userB); }); }); + + it("recalculates in acceptable time without heroes", function () { + for (let i = 0; i < 5000; i++) { + addMember(`@person${i}:bar`, KnownMembership.Join, { name: `Person ${i % 20} ${i % 10} ${i % 3}` }); + } + + // This isn't a real performance test and has plenty of headroom because github + // runners don't offer any kind of speed consistency guarantee, but this should at + // least assert that the perf doesn't suddenly become n^2. + const start = performance.now(); + for (let i = 0; i < 50; i++) { + room.recalculate(); + } + const duration = performance.now() - start; + expect(duration).toBeLessThan(200); + }); }); describe("receipts", function () { diff --git a/src/models/room.ts b/src/models/room.ts index ab5eb7bfd9c..0310b88fe34 100644 --- a/src/models/room.ts +++ b/src/models/room.ts @@ -24,7 +24,7 @@ import { } from "./event-timeline-set"; import { Direction, EventTimeline } from "./event-timeline"; import { getHttpUriForMxc } from "../content-repo"; -import { compare, removeElement } from "../utils"; +import { removeElement } from "../utils"; import { normalize, noUnsafeEventProps } from "../utils"; import { IEvent, IThreadBundledRelationship, MatrixEvent, MatrixEventEvent, MatrixEventHandlerMap } from "./event"; import { EventStatus } from "./event-status"; @@ -3451,7 +3451,8 @@ export class Room extends ReadReceipt { return true; }); // make sure members have stable order - otherMembers.sort((a, b) => compare(a.userId, b.userId)); + const collator = new Intl.Collator(); + otherMembers.sort((a, b) => collator.compare(a.userId, b.userId)); // only 5 first members, immitate summaryHeroes otherMembers = otherMembers.slice(0, 5); otherNames = otherMembers.map((m) => m.name); diff --git a/src/utils.ts b/src/utils.ts index 1d4505f4bb4..0451307d1d1 100644 --- a/src/utils.ts +++ b/src/utils.ts @@ -649,16 +649,6 @@ export function lexicographicCompare(a: string, b: string): number { } } -const collator = new Intl.Collator(); -/** - * Performant language-sensitive string comparison - * @param a - the first string to compare - * @param b - the second string to compare - */ -export function compare(a: string, b: string): number { - return collator.compare(a, b); -} - /** * This function is similar to Object.assign() but it assigns recursively and * allows you to ignore nullish values from the source