mirror of https://github.com/vector-im/riot-web
More micro optimizations to make the hot paths faster
parent
561d1f37ec
commit
64103b7af4
|
@ -282,23 +282,29 @@ class RoomListStore extends Store {
|
||||||
|
|
||||||
let inserted = false;
|
let inserted = false;
|
||||||
for (const key of Object.keys(this._state.lists)) {
|
for (const key of Object.keys(this._state.lists)) {
|
||||||
listsClone[key] = [];
|
|
||||||
let pushedEntry = false;
|
|
||||||
const hasRoom = this._state.lists[key].some((e) => e.room.roomId === room.roomId);
|
const hasRoom = this._state.lists[key].some((e) => e.room.roomId === room.roomId);
|
||||||
|
|
||||||
|
// Speed optimization: Skip the loop below if we're not going to do anything productive
|
||||||
|
if (!hasRoom || LIST_ORDERS[key] !== 'recent') {
|
||||||
|
listsClone[key] = this._state.lists[key];
|
||||||
|
continue;
|
||||||
|
} else {
|
||||||
|
listsClone[key] = [];
|
||||||
|
}
|
||||||
|
|
||||||
// We track where the boundary within listsClone[key] is just in case our timestamp
|
// We track where the boundary within listsClone[key] is just in case our timestamp
|
||||||
// ordering fails. If we can't stick the room in at the correct place in the category
|
// ordering fails. If we can't stick the room in at the correct place in the category
|
||||||
// grouping based on timestamp, we'll stick it at the top of the group which will be
|
// grouping based on timestamp, we'll stick it at the top of the group which will be
|
||||||
// the index we track here.
|
// the index we track here.
|
||||||
let desiredCategoryBoundaryIndex = 0;
|
let desiredCategoryBoundaryIndex = 0;
|
||||||
let foundBoundary = false;
|
let foundBoundary = false;
|
||||||
|
let pushedEntry = false;
|
||||||
|
|
||||||
for (const entry of this._state.lists[key]) {
|
for (const entry of this._state.lists[key]) {
|
||||||
// if the list is a recent list, and the room appears in this list, and we're not looking at a sticky
|
// if the list is a recent list, and the room appears in this list, and we're not looking at a sticky
|
||||||
// room (sticky rooms have unreliable categories), try to slot the new room in
|
// room (sticky rooms have unreliable categories), try to slot the new room in
|
||||||
if (LIST_ORDERS[key] === 'recent' && hasRoom && entry.room.roomId !== this._state.stickyRoomId) {
|
if (entry.room.roomId !== this._state.stickyRoomId) {
|
||||||
const inTag = targetTags.length === 0 || targetTags.includes(key);
|
if (!pushedEntry && doInsert && (targetTags.length === 0 || targetTags.includes(key))) {
|
||||||
if (!pushedEntry && doInsert && inTag) {
|
|
||||||
// Micro optimization: Support lazily loading the last timestamp in a room
|
// Micro optimization: Support lazily loading the last timestamp in a room
|
||||||
let _entryTimestamp = null;
|
let _entryTimestamp = null;
|
||||||
const entryTimestamp = () => {
|
const entryTimestamp = () => {
|
||||||
|
@ -356,7 +362,7 @@ class RoomListStore extends Store {
|
||||||
tags = targetTags;
|
tags = targetTags;
|
||||||
}
|
}
|
||||||
if (tags.length === 0) {
|
if (tags.length === 0) {
|
||||||
tags.push(myMembership === 'join' ? 'im.vector.fake.recent' : 'im.vector.fake.invite');
|
tags = [myMembership === 'join' ? 'im.vector.fake.recent' : 'im.vector.fake.invite'];
|
||||||
}
|
}
|
||||||
} else {
|
} else {
|
||||||
tags = ['im.vector.fake.archived'];
|
tags = ['im.vector.fake.archived'];
|
||||||
|
@ -388,7 +394,15 @@ class RoomListStore extends Store {
|
||||||
};
|
};
|
||||||
|
|
||||||
const dmRoomMap = DMRoomMap.shared();
|
const dmRoomMap = DMRoomMap.shared();
|
||||||
const isCustomTagsEnabled = SettingsStore.isFeatureEnabled("feature_custom_tags");
|
|
||||||
|
// Speed optimization: Hitting the SettingsStore is expensive, so avoid that at all costs.
|
||||||
|
let _isCustomTagsEnabled = null;
|
||||||
|
const isCustomTagsEnabled = () => {
|
||||||
|
if (_isCustomTagsEnabled === null) {
|
||||||
|
_isCustomTagsEnabled = SettingsStore.isFeatureEnabled("feature_custom_tags");
|
||||||
|
}
|
||||||
|
return _isCustomTagsEnabled;
|
||||||
|
};
|
||||||
|
|
||||||
this._matrixClient.getRooms().forEach((room) => {
|
this._matrixClient.getRooms().forEach((room) => {
|
||||||
const myUserId = this._matrixClient.getUserId();
|
const myUserId = this._matrixClient.getUserId();
|
||||||
|
@ -403,7 +417,9 @@ class RoomListStore extends Store {
|
||||||
|
|
||||||
// ignore any m. tag names we don't know about
|
// ignore any m. tag names we don't know about
|
||||||
tagNames = tagNames.filter((t) => {
|
tagNames = tagNames.filter((t) => {
|
||||||
return (isCustomTagsEnabled && !t.startsWith('m.')) || lists[t] !== undefined;
|
// Speed optimization: Avoid hitting the SettingsStore at all costs by making it the
|
||||||
|
// last condition possible.
|
||||||
|
return lists[t] !== undefined || (!t.startsWith('m.') && isCustomTagsEnabled());
|
||||||
});
|
});
|
||||||
|
|
||||||
if (tagNames.length) {
|
if (tagNames.length) {
|
||||||
|
@ -411,9 +427,10 @@ class RoomListStore extends Store {
|
||||||
const tagName = tagNames[i];
|
const tagName = tagNames[i];
|
||||||
lists[tagName] = lists[tagName] || [];
|
lists[tagName] = lists[tagName] || [];
|
||||||
|
|
||||||
// We categorize all the tagged rooms the same because we don't actually
|
// Default to an arbitrary category for tags which aren't ordered by recents
|
||||||
// care about the order (it's defined elsewhere)
|
let category = CATEGORY_IDLE;
|
||||||
lists[tagName].push({room, category: CATEGORY_RED});
|
if (LIST_ORDERS[tagName] === 'recent') category = this._calculateCategory(room);
|
||||||
|
lists[tagName].push({room, category: category});
|
||||||
}
|
}
|
||||||
} else if (dmRoomMap.getUserIdForRoomId(room.roomId)) {
|
} else if (dmRoomMap.getUserIdForRoomId(room.roomId)) {
|
||||||
// "Direct Message" rooms (that we're still in and that aren't otherwise tagged)
|
// "Direct Message" rooms (that we're still in and that aren't otherwise tagged)
|
||||||
|
@ -422,7 +439,9 @@ class RoomListStore extends Store {
|
||||||
lists["im.vector.fake.recent"].push({room, category: this._calculateCategory(room)});
|
lists["im.vector.fake.recent"].push({room, category: this._calculateCategory(room)});
|
||||||
}
|
}
|
||||||
} else if (membership === "leave") {
|
} else if (membership === "leave") {
|
||||||
lists["im.vector.fake.archived"].push({room, category: this._calculateCategory(room)});
|
// The category of these rooms is not super important, so deprioritize it to the lowest
|
||||||
|
// possible value.
|
||||||
|
lists["im.vector.fake.archived"].push({room, category: CATEGORY_IDLE});
|
||||||
}
|
}
|
||||||
});
|
});
|
||||||
|
|
||||||
|
@ -442,6 +461,7 @@ class RoomListStore extends Store {
|
||||||
if (latestEventTsCache[room.roomId]) {
|
if (latestEventTsCache[room.roomId]) {
|
||||||
return latestEventTsCache[room.roomId];
|
return latestEventTsCache[room.roomId];
|
||||||
}
|
}
|
||||||
|
|
||||||
const ts = this._tsOfNewestEvent(room);
|
const ts = this._tsOfNewestEvent(room);
|
||||||
latestEventTsCache[room.roomId] = ts;
|
latestEventTsCache[room.roomId] = ts;
|
||||||
return ts;
|
return ts;
|
||||||
|
@ -515,7 +535,7 @@ class RoomListStore extends Store {
|
||||||
const idxB = CATEGORY_ORDER.indexOf(categoryB);
|
const idxB = CATEGORY_ORDER.indexOf(categoryB);
|
||||||
if (idxA > idxB) return 1;
|
if (idxA > idxB) return 1;
|
||||||
if (idxA < idxB) return -1;
|
if (idxA < idxB) return -1;
|
||||||
return 0;
|
return 0; // Technically not possible
|
||||||
}
|
}
|
||||||
|
|
||||||
const timestampA = tsOfNewestEventFn(roomA);
|
const timestampA = tsOfNewestEventFn(roomA);
|
||||||
|
|
Loading…
Reference in New Issue