···215215216216To see all configurable options for coverage, see the [coverage Config Reference](https://vitest.dev/config/#coverage).
217217218218+## Coverage performance
219219+220220+If code coverage generation is slow on your project, see [Profiling Test Performance | Code coverage](/guide/profiling-test-performance.html#code-coverage).
221221+218222## Vitest UI
219223220224You can check your coverage report in [Vitest UI](/guide/ui).
+26
docs/guide/profiling-test-performance.md
···178178_src_prime-number_ts-525172412.js
179179```
180180181181+## Code coverage
182182+183183+If code coverage generation is slow on your project you can use `DEBUG=vitest:coverage` environment variable to enable performance logging.
184184+185185+```bash
186186+$ DEBUG=vitest:coverage vitest --run --coverage
187187+188188+ RUN v3.1.1 /x/vitest-example
189189+190190+ vitest:coverage Reading coverage results 2/2
191191+ vitest:coverage Converting 1/2
192192+ vitest:coverage 4 ms /x/src/multiply.ts
193193+ vitest:coverage Converting 2/2
194194+ vitest:coverage 552 ms /x/src/add.ts
195195+ vitest:coverage Uncovered files 1/2
196196+ vitest:coverage File "/x/src/large-file.ts" is taking longer than 3s # [!code error]
197197+ vitest:coverage 3027 ms /x/src/large-file.ts
198198+ vitest:coverage Uncovered files 2/2
199199+ vitest:coverage 4 ms /x/src/untested-file.ts
200200+ vitest:coverage Generate coverage total time 3521 ms
201201+```
202202+203203+This profiling approach is great for detecting large files that are accidentally picked by coverage providers.
204204+For example if your configuration is accidentally including large built minified Javascript files in code coverage, they should appear in logs.
205205+In these cases you might want to adjust your [`coverage.include`](/config/#coverage-include) and [`coverage.exclude`](/config/#coverage-exclude) options.
206206+181207## Inspecting profiling records
182208183209You can inspect the contents of `*.cpuprofile` and `*.heapprofile` with various tools. See list below for examples.
+23-1
packages/coverage-istanbul/src/provider.ts
···8989 }
90909191 async generateCoverage({ allTestsRun }: ReportContext): Promise<CoverageMap> {
9292+ const start = debug.enabled ? performance.now() : 0
9393+9294 const coverageMap = this.createCoverageMap()
9395 let coverageMapByTransformMode = this.createCoverageMap()
9496···118120119121 if (this.options.excludeAfterRemap) {
120122 coverageMap.filter(filename => this.testExclude.shouldInstrument(filename))
123123+ }
124124+125125+ if (debug.enabled) {
126126+ debug('Generate coverage total time %d ms', (performance.now() - start!).toFixed())
121127 }
122128123129 return coverageMap
···182188 // Note that these cannot be run parallel as synchronous instrumenter.lastFileCoverage
183189 // returns the coverage of the last transformed file
184190 for (const [index, filename] of uncoveredFiles.entries()) {
185185- debug('Uncovered file %s %d/%d', filename, index, uncoveredFiles.length)
191191+ let timeout: ReturnType<typeof setTimeout> | undefined
192192+ let start: number | undefined
193193+194194+ if (debug.enabled) {
195195+ start = performance.now()
196196+ timeout = setTimeout(() => debug(c.bgRed(`File "${filename}" is taking longer than 3s`)), 3_000)
197197+198198+ debug('Uncovered file %d/%d', index, uncoveredFiles.length)
199199+ }
186200187201 // Make sure file is not served from cache so that instrumenter loads up requested file coverage
188202 await transform(`${filename}?v=${cacheKey}`)
189203 const lastCoverage = this.instrumenter.lastFileCoverage()
190204 coverageMap.addFileCoverage(lastCoverage)
205205+206206+ if (debug.enabled) {
207207+ clearTimeout(timeout)
208208+209209+ const diff = performance.now() - start!
210210+ const color = diff > 500 ? c.bgRed : c.bgGreen
211211+ debug(`${color(` ${diff.toFixed()} ms `)} ${filename}`)
212212+ }
191213 }
192214193215 return coverageMap