You cannot shrink a run you have never measured. The first step is a single, complete mutation run on a representative commit, with logs detailed enough to answer three questions per mutated file: how many mutants were generated, how long the file took, and how many survivors were killed later versus judged equivalent. Almost every mutation tool already emits the raw material. StrykerJS, for example, writes results to a JSON incremental file and can reuse results across runs when a mutant was killed and its culprit test is unchanged, or when no new test covers an unkilled mutant the incremental docs. That same file is your cost ledger.
The scale problem is real. In a StrykerJS issue thread, one user reported roughly 3,500 mutants taking about five hours with a Karma/Chrome setup, and another with about 1,000 unit tests said a run was under half done after hours on six runners the incremental support issue. Bitcoin Core's weekly mutation job was described as taking over 30 hours on its setup, partly because some functional tests alone take more than a minute, so 20 mutants cost at least 20 minutes the Bitcoin Core write-up. If your full run is in that territory, the ledger matters more than the score.
Before you touch anything, join the ledger with the change history. For each mutant, record the file, the operator, the line, whether it was killed, and how long the containing test run took. Then split survivors into three buckets: equivalent (no test can kill it), stubborn (killable but nobody has written the test yet), and already covered by a test added after the run. Yao, Harman and Jia found that equivalence and stubbornness are highly unevenly distributed across operators: their manual analysis of 1,230 mutants from 18 programs found the ABS class and half of the UOI class produced many equivalent and almost no stubborn mutants, while the LCR class produced many stubborn and few equivalent ones the ICSE study of equivalent and stubborn operators. That unevenness is the lever you are about to pull.



