Files
react/scripts/jest/sizeBalancedSequencer.js
lauren d6cae440e3 [ci] Add size-balanced test sequencer for better shard distribution (#35458)
Jest's default test sequencer sorts alphabetically, causing large test
files
(eg ReactDOMFloat-test.js at 9k lines,
ReactHooksWithNoopRenderer-test.js at 4k
lines) to cluster in shard 3/5. This made shard 3/5 average 117s vs 77s
for
other shards, a 52% slowdown. I'm using filesize as a rough proxy for
number of tests.

This custom sequencer sorts tests by file size and distributes large
files evenly across all shards
instead of clustering them together.

---
[//]: # (BEGIN SAPLING FOOTER)
Stack created with [Sapling](https://sapling-scm.com). Best reviewed
with [ReviewStack](https://reviewstack.dev/facebook/react/pull/35458).
* __->__ #35458
* #35459
2026-01-06 21:29:22 -05:00

29 lines
768 B
JavaScript

'use strict';
const Sequencer = require('@jest/test-sequencer').default;
const fs = require('fs');
class SizeBalancedSequencer extends Sequencer {
shard(tests, {shardIndex, shardCount}) {
const shards = Array.from({length: shardCount}, () => ({
tests: [],
size: 0,
}));
const sorted = [...tests].sort(
(a, b) => fs.statSync(b.path).size - fs.statSync(a.path).size
);
for (let i = 0; i < sorted.length; i++) {
const test = sorted[i];
const size = fs.statSync(test.path).size;
const smallest = shards.reduce((min, s) => (s.size < min.size ? s : min));
smallest.tests.push(test);
smallest.size += size;
}
return shards[shardIndex - 1].tests;
}
}
module.exports = SizeBalancedSequencer;