Skip to content

Commit 5da64d2

Browse files
Reduce number of file_get_contents() and hash() calls
1 parent b932c06 commit 5da64d2

26 files changed

+656
-640
lines changed

ChangeLog-12.2.md

+1
Original file line numberDiff line numberDiff line change
@@ -8,6 +8,7 @@ All notable changes are documented in this file using the [Keep a CHANGELOG](htt
88

99
* [#1074](https://github.com/sebastianbergmann/php-code-coverage/issues/1074): Use more efficient `AttributeParentConnectingVisitor`
1010
* [#1076](https://github.com/sebastianbergmann/php-code-coverage/issues/1076): Replace unmaintained JavaScript library for charts with billboard.js
11+
* Reduced number of I/O and hashing operations when using the static analysis cache
1112
* Use SHA-256 instead of MD5 to generate cache keys for static analysis cache (as SHA-256 is significantly faster than MD5 with PHP >= 8.4 on modern CPUs)
1213

1314
[12.2.0]: https://github.com/sebastianbergmann/php-code-coverage/compare/12.1.2...main

src/CodeCoverage.php

+13-12
Original file line numberDiff line numberDiff line change
@@ -25,9 +25,9 @@
2525
use SebastianBergmann\CodeCoverage\Driver\Driver;
2626
use SebastianBergmann\CodeCoverage\Node\Builder;
2727
use SebastianBergmann\CodeCoverage\Node\Directory;
28-
use SebastianBergmann\CodeCoverage\StaticAnalysis\CachingFileAnalyser;
28+
use SebastianBergmann\CodeCoverage\StaticAnalysis\CachingSourceAnalyser;
2929
use SebastianBergmann\CodeCoverage\StaticAnalysis\FileAnalyser;
30-
use SebastianBergmann\CodeCoverage\StaticAnalysis\ParsingFileAnalyser;
30+
use SebastianBergmann\CodeCoverage\StaticAnalysis\ParsingSourceAnalyser;
3131
use SebastianBergmann\CodeCoverage\Test\Target\MapBuilder;
3232
use SebastianBergmann\CodeCoverage\Test\Target\Mapper;
3333
use SebastianBergmann\CodeCoverage\Test\Target\TargetCollection;
@@ -436,7 +436,7 @@ private function applyExecutableLinesFilter(RawCodeCoverageData $data): void
436436
continue;
437437
}
438438

439-
$linesToBranchMap = $this->analyser()->executableLinesIn($filename);
439+
$linesToBranchMap = $this->analyser()->analyse($filename)->executableLines();
440440

441441
$data->keepLineCoverageDataOnlyForLines(
442442
$filename,
@@ -459,7 +459,7 @@ private function applyIgnoredLinesFilter(RawCodeCoverageData $data): void
459459

460460
$data->removeCoverageDataForLines(
461461
$filename,
462-
$this->analyser()->ignoredLinesFor($filename),
462+
$this->analyser()->analyse($filename)->ignoredLines(),
463463
);
464464
}
465465
}
@@ -627,20 +627,21 @@ private function analyser(): FileAnalyser
627627
return $this->analyser;
628628
}
629629

630-
$this->analyser = new ParsingFileAnalyser(
631-
$this->useAnnotationsForIgnoringCode,
632-
$this->ignoreDeprecatedCode,
633-
);
630+
$sourceAnalyser = new ParsingSourceAnalyser;
634631

635632
if ($this->cachesStaticAnalysis()) {
636-
$this->analyser = new CachingFileAnalyser(
633+
$sourceAnalyser = new CachingSourceAnalyser(
637634
$this->cacheDirectory,
638-
$this->analyser,
639-
$this->useAnnotationsForIgnoringCode,
640-
$this->ignoreDeprecatedCode,
635+
$sourceAnalyser,
641636
);
642637
}
643638

639+
$this->analyser = new FileAnalyser(
640+
$sourceAnalyser,
641+
$this->useAnnotationsForIgnoringCode,
642+
$this->ignoreDeprecatedCode,
643+
);
644+
644645
return $this->analyser;
645646
}
646647
}

src/Data/RawCodeCoverageData.php

+1-1
Original file line numberDiff line numberDiff line change
@@ -90,7 +90,7 @@ public static function fromUncoveredFile(string $filename, FileAnalyser $analyse
9090
{
9191
$lineCoverage = array_map(
9292
static fn (): int => Driver::LINE_NOT_EXECUTED,
93-
$analyser->executableLinesIn($filename),
93+
$analyser->analyse($filename)->executableLines(),
9494
);
9595

9696
return new self([$filename => $lineCoverage], []);

src/Node/Builder.php

+6-4
Original file line numberDiff line numberDiff line change
@@ -70,17 +70,19 @@ private function addItems(Directory $root, array $items, array $tests): void
7070
$filename = $root->pathAsString() . DIRECTORY_SEPARATOR . $key;
7171

7272
if (is_file($filename)) {
73+
$analysisResult = $this->analyser->analyse($filename);
74+
7375
$root->addFile(
7476
new File(
7577
$key,
7678
$root,
7779
$value['lineCoverage'],
7880
$value['functionCoverage'],
7981
$tests,
80-
$this->analyser->classesIn($filename),
81-
$this->analyser->traitsIn($filename),
82-
$this->analyser->functionsIn($filename),
83-
$this->analyser->linesOfCodeFor($filename),
82+
$analysisResult->classes(),
83+
$analysisResult->traits(),
84+
$analysisResult->functions(),
85+
$analysisResult->linesOfCode(),
8486
),
8587
);
8688
}

src/Node/File.php

+2-2
Original file line numberDiff line numberDiff line change
@@ -13,8 +13,8 @@
1313
use function count;
1414
use function range;
1515
use SebastianBergmann\CodeCoverage\CodeCoverage;
16+
use SebastianBergmann\CodeCoverage\StaticAnalysis\AnalysisResult;
1617
use SebastianBergmann\CodeCoverage\StaticAnalysis\Class_;
17-
use SebastianBergmann\CodeCoverage\StaticAnalysis\FileAnalyser;
1818
use SebastianBergmann\CodeCoverage\StaticAnalysis\Function_;
1919
use SebastianBergmann\CodeCoverage\StaticAnalysis\LinesOfCode;
2020
use SebastianBergmann\CodeCoverage\StaticAnalysis\Method;
@@ -24,7 +24,7 @@
2424
* @internal This class is not covered by the backward compatibility promise for phpunit/php-code-coverage
2525
*
2626
* @phpstan-import-type TestType from CodeCoverage
27-
* @phpstan-import-type LinesType from FileAnalyser
27+
* @phpstan-import-type LinesType from AnalysisResult
2828
*
2929
* @phpstan-type ProcessedFunctionType array{
3030
* functionName: string,

src/StaticAnalysis/CacheWarmer.php

+15-17
Original file line numberDiff line numberDiff line change
@@ -9,38 +9,36 @@
99
*/
1010
namespace SebastianBergmann\CodeCoverage\StaticAnalysis;
1111

12+
use function file_get_contents;
1213
use SebastianBergmann\CodeCoverage\Filter;
1314

14-
final class CacheWarmer
15+
/**
16+
* @internal This class is not covered by the backward compatibility promise for phpunit/php-code-coverage
17+
*/
18+
final readonly class CacheWarmer
1519
{
1620
/**
1721
* @return array{cacheHits: non-negative-int, cacheMisses: non-negative-int}
1822
*/
1923
public function warmCache(string $cacheDirectory, bool $useAnnotationsForIgnoringCode, bool $ignoreDeprecatedCode, Filter $filter): array
2024
{
21-
$analyser = new CachingFileAnalyser(
25+
$analyser = new CachingSourceAnalyser(
2226
$cacheDirectory,
23-
new ParsingFileAnalyser(
24-
$useAnnotationsForIgnoringCode,
25-
$ignoreDeprecatedCode,
26-
),
27-
$useAnnotationsForIgnoringCode,
28-
$ignoreDeprecatedCode,
27+
new ParsingSourceAnalyser,
2928
);
3029

31-
$cacheHits = 0;
32-
$cacheMisses = 0;
33-
3430
foreach ($filter->files() as $file) {
35-
$statistics = $analyser->process($file);
36-
37-
$cacheHits += $statistics['cacheHits'];
38-
$cacheMisses += $statistics['cacheMisses'];
31+
$analyser->analyse(
32+
$file,
33+
file_get_contents($file),
34+
$useAnnotationsForIgnoringCode,
35+
$ignoreDeprecatedCode,
36+
);
3937
}
4038

4139
return [
42-
'cacheHits' => $cacheHits,
43-
'cacheMisses' => $cacheMisses,
40+
'cacheHits' => $analyser->cacheHits(),
41+
'cacheMisses' => $analyser->cacheMisses(),
4442
];
4543
}
4644
}

0 commit comments

Comments
 (0)