mirror of
https://github.com/fluxerapp/fluxer
synced 2026-10-17 13:05:32 +09:00
75 lines
2.6 KiB
TypeScript
75 lines
2.6 KiB
TypeScript
// SPDX-License-Identifier: AGPL-3.0-or-later
|
|
|
|
import {
|
|
areMemberListRangesCovered,
|
|
areMemberListRangesEqual,
|
|
areNormalizedMemberListRangesCovered,
|
|
areNormalizedMemberListRangesEqual,
|
|
buildMemberListRangeWindow,
|
|
buildMemberListRenderWindow,
|
|
normalizeMemberListRanges,
|
|
} from '@app/features/member/utils/MemberListRangeUtils';
|
|
import {bench, describe} from 'vitest';
|
|
|
|
const ROW_HEIGHT = 44;
|
|
const VIEWPORT_HEIGHT = ROW_HEIGHT * 18;
|
|
const LARGE_TOTAL_ROWS = 100_000;
|
|
const SCROLL_OFFSETS = Array.from({length: 1_000}, (_, index) => ((index * 997) % LARGE_TOTAL_ROWS) * ROW_HEIGHT);
|
|
const OVERLAPPING_RANGES = Array.from({length: 1_000}, (_, index): [number, number] => {
|
|
const start = (index * 37) % 20_000;
|
|
return [start, start + ((index * 13) % 150)];
|
|
});
|
|
const COVERING_RANGES = Array.from({length: 1_000}, (_, index): [number, number] => [index * 100, index * 100 + 99]);
|
|
const INNER_RANGES = Array.from({length: 1_000}, (_, index): [number, number] => [index * 100 + 25, index * 100 + 75]);
|
|
const COVERING_RANGES_COPY = COVERING_RANGES.map((range): [number, number] => [range[0], range[1]]);
|
|
const NORMALIZED_COVERING_RANGES = normalizeMemberListRanges(COVERING_RANGES);
|
|
const NORMALIZED_COVERING_RANGES_COPY = normalizeMemberListRanges(COVERING_RANGES_COPY);
|
|
const NORMALIZED_INNER_RANGES = normalizeMemberListRanges(INNER_RANGES);
|
|
|
|
describe('MemberListRangeUtils benchmarks', () => {
|
|
bench('normalize 1k mixed overlapping ranges', () => {
|
|
normalizeMemberListRanges(OVERLAPPING_RANGES);
|
|
});
|
|
|
|
bench('build subscription windows while fast scrolling', () => {
|
|
for (const scrollTop of SCROLL_OFFSETS) {
|
|
buildMemberListRangeWindow({
|
|
scrollTop,
|
|
clientHeight: VIEWPORT_HEIGHT,
|
|
rowHeight: ROW_HEIGHT,
|
|
bufferRows: 12,
|
|
overscanPages: 0,
|
|
totalRows: LARGE_TOTAL_ROWS,
|
|
});
|
|
}
|
|
});
|
|
|
|
bench('build render windows while fast scrolling', () => {
|
|
for (const scrollTop of SCROLL_OFFSETS) {
|
|
buildMemberListRenderWindow({
|
|
scrollTop,
|
|
clientHeight: VIEWPORT_HEIGHT,
|
|
rowHeight: ROW_HEIGHT,
|
|
bufferRows: 6,
|
|
totalRows: LARGE_TOTAL_ROWS,
|
|
});
|
|
}
|
|
});
|
|
|
|
bench('coverage checks for 1k normalized pages', () => {
|
|
areMemberListRangesCovered(INNER_RANGES, COVERING_RANGES);
|
|
});
|
|
|
|
bench('normalized coverage checks without re-normalizing', () => {
|
|
areNormalizedMemberListRangesCovered(NORMALIZED_INNER_RANGES, NORMALIZED_COVERING_RANGES);
|
|
});
|
|
|
|
bench('range equality for raw normalized-shaped windows', () => {
|
|
areMemberListRangesEqual(COVERING_RANGES, COVERING_RANGES_COPY);
|
|
});
|
|
|
|
bench('normalized range equality without re-normalizing', () => {
|
|
areNormalizedMemberListRangesEqual(NORMALIZED_COVERING_RANGES, NORMALIZED_COVERING_RANGES_COPY);
|
|
});
|
|
});
|