diff --git a/Makefile b/Makefile index 43d16b3..ab009bb 100644 --- a/Makefile +++ b/Makefile @@ -44,6 +44,9 @@ psalm: ensure phpunit: sh -c "${PHPQA_DOCKER_COMMAND} phpunit-7 --verbose" +benchmark: ensure + sh -c "${PHPQA_DOCKER_COMMAND} phpbench run --iterations=10 --report=aggregate" + phpunit-coverage: ensure sh -c "${PHPQA_DOCKER_COMMAND} phpdbg -qrr /tools/phpunit-7 --verbose --coverage-text --log-junit=var/phpunit.junit.xml --coverage-xml var/coverage-xml/" diff --git a/composer.json b/composer.json index ba3404a..5591724 100644 --- a/composer.json +++ b/composer.json @@ -26,6 +26,7 @@ "nicmart/tree": "^0.2,>= 0.2.4", "nyholm/nsa": "^1.1", "nyholm/symfony-bundle-test": "^1.4", + "phpbench/phpbench": "^0.16", "phpoffice/phpspreadsheet": "^1.4,>= 1.4.1", "phpunit/phpunit": "^7.0", "symfony/console": "^3.4 || ^4.0", diff --git a/phpbench.json.dist b/phpbench.json.dist new file mode 100644 index 0000000..dcdd9a4 --- /dev/null +++ b/phpbench.json.dist @@ -0,0 +1,18 @@ +{ + "bootstrap": "vendor/autoload.php", + "path": "tests/Xezilaires/Performance", + + "retry_threshold": 5, + "progress": "dots", + + "annotation_import_use": true, + "extensions": [ + "PhpBench\\Extensions\\Dbal\\DbalExtension", + "PhpBench\\Extensions\\XDebug\\XDebugExtension" + ], + "storage": "dbal", + "storage.dbal.connection": { + "driver": "pdo_sqlite", + "path": "var/phpbench-history.db" + } +} diff --git a/phpstan.neon.dist b/phpstan.neon.dist index 0a3961f..14c7263 100644 --- a/phpstan.neon.dist +++ b/phpstan.neon.dist @@ -25,3 +25,4 @@ parameters: paths: - %currentWorkingDirectory%/tests/Xezilaires/Bridge/Spout/SpreadsheetTest.php - %currentWorkingDirectory%/tests/Xezilaires/Functional/FunctionalTestCase.php + - %currentWorkingDirectory%/tests/Xezilaires/Performance/PerformanceTestCase.php diff --git a/resources/fixtures/massive.xlsx b/resources/fixtures/massive.xlsx new file mode 100644 index 0000000..a3f7147 Binary files /dev/null and b/resources/fixtures/massive.xlsx differ diff --git a/tests/Xezilaires/Performance/PerformanceTestCase.php b/tests/Xezilaires/Performance/PerformanceTestCase.php new file mode 100644 index 0000000..5618d9e --- /dev/null +++ b/tests/Xezilaires/Performance/PerformanceTestCase.php @@ -0,0 +1,82 @@ + + * + * This source file is subject to the MIT license that is bundled + * with this source code in the file LICENSE. + */ + +namespace Xezilaires\Test\Performance; + +use PhpBench\Benchmark\Metadata\Annotations as Bench; +use Symfony\Component\Serializer\Normalizer\ObjectNormalizer; +use Symfony\Component\Serializer\Serializer; +use Xezilaires\Bridge\Symfony\Serializer\ObjectSerializer; +use Xezilaires\Metadata\ColumnReference; +use Xezilaires\Metadata\Mapping; +use Xezilaires\Spreadsheet; +use Xezilaires\SpreadsheetIterator; +use Xezilaires\Test\FixtureTrait; +use Xezilaires\Test\Model\Product; + +/** + * @Bench\BeforeMethods({"setUp"}) + */ +abstract class PerformanceTestCase +{ + use FixtureTrait; + + /** + * @var Mapping + */ + private $mapping; + + public function setUp(): void + { + $this->mapping = new Mapping( + Product::class, + [ + 'name' => new ColumnReference('A'), + 'price' => new ColumnReference('B'), + ], + [ + 'start' => 2, + ] + ); + } + + /** + * @Bench\Assert(stat="mean", value="10") + * @Bench\Revs(1000) + */ + public function benchIteratorConstruction(): void + { + $this->getSpreadsheet($this->fixture('massive.xlsx')); + } + + /** + * @Bench\Assert(stat="mean", value="10") + * @Bench\Revs(1000) + */ + public function benchIteratorIteration(): void + { + $iterator = $this->createIterator($this->getSpreadsheet($this->fixture('products.xlsx')), $this->mapping); + + foreach ($iterator as $row) { + } + } + + abstract protected function getSpreadsheet(\SplFileObject $file): Spreadsheet; + + private function createIterator(Spreadsheet $spreadsheet, Mapping $mapping): SpreadsheetIterator + { + $serializer = new ObjectSerializer(new Serializer([new ObjectNormalizer()])); + + return new SpreadsheetIterator($spreadsheet, $mapping, $serializer); + } +} diff --git a/tests/Xezilaires/Performance/Spout/SpoutSpreadsheetIteratorBench.php b/tests/Xezilaires/Performance/Spout/SpoutSpreadsheetIteratorBench.php new file mode 100644 index 0000000..9aeb445 --- /dev/null +++ b/tests/Xezilaires/Performance/Spout/SpoutSpreadsheetIteratorBench.php @@ -0,0 +1,31 @@ + + * + * This source file is subject to the MIT license that is bundled + * with this source code in the file LICENSE. + */ + +namespace Xezilaires\Test\Performance\Spout; + +use PhpBench\Benchmark\Metadata\Annotations as Bench; +use Xezilaires\Spreadsheet; +use Xezilaires\Test\Performance\PerformanceTestCase; + +/** + * @internal + * + * @small + */ +final class SpoutSpreadsheetIteratorBench extends PerformanceTestCase +{ + protected function getSpreadsheet(\SplFileObject $file): Spreadsheet + { + return new \Xezilaires\Bridge\Spout\Spreadsheet($file); + } +}