| 1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253545556575859606162636465666768697071727374757677787980818283848586878889909192 |
- <?php
- /**
- * Tests the QRMatrix write performance
- *
- * @created 16.10.2023
- * @author smiley <smiley@chillerlan.net>
- * @copyright 2023 smiley
- * @license MIT
- */
- namespace chillerlan\QRCodeTest\Performance;
- use chillerlan\QRCode\Common\{EccLevel, Mode, Version};
- use chillerlan\QRCode\Data\QRData;
- use chillerlan\QRCode\QROptions;
- use chillerlan\QRCodeTest\QRMaxLengthTrait;
- use Generator;
- use function file_put_contents;
- use function json_encode;
- use function printf;
- use function sprintf;
- use function str_repeat;
- use function str_replace;
- use const JSON_PRETTY_PRINT;
- require_once __DIR__.'/../../vendor/autoload.php';
- // excerpt from QRCodeReaderTestAbstract
- $generator = new class () {
- use QRMaxLengthTrait;
- public function dataProvider():Generator{
- $dataModeData = [
- Mode::NUMBER => str_repeat('0123456789', 750),
- Mode::ALPHANUM => str_repeat('ABCDEFGHIJKLMNOPQRSTUVWXYZ1234567890 $%*+-./:', 100),
- Mode::KANJI => str_repeat('漂う花の香り', 350),
- Mode::HANZI => str_repeat('无可奈何燃花作香', 250),
- Mode::BYTE => str_repeat('https://www.youtube.com/watch?v=dQw4w9WgXcQ ', 100),
- ];
- foreach(Mode::INTERFACES as $dataMode => $dataModeInterface){
- $dataModeName = str_replace('chillerlan\\QRCode\\Data\\', '', $dataModeInterface);
- for($v = 1; $v <= 40; $v++){
- $version = new Version($v);
- foreach([EccLevel::L, EccLevel::M, EccLevel::Q, EccLevel::H] as $ecc){
- $eccLevel = new EccLevel($ecc);
- yield sprintf('version %2s%s (%s)', $version, $eccLevel, $dataModeName) => [
- $version->getVersionNumber(),
- $eccLevel,
- $dataModeInterface,
- $dataModeName,
- mb_substr($dataModeData[$dataMode], 0, self::getMaxLengthForMode($dataMode, $version, $eccLevel)),
- ];
- }
- }
- }
- }
- };
- $test = new PerformanceTest(100);
- $json = [];
- foreach($generator->dataProvider() as $key => [$version, $eccLevel, $dataModeInterface, $dataModeName, $data]){
- // invovcation tests the performance of QRData::writeBitBuffer()
- $test->run(fn() => new QRData(new QROptions(['version' => $version, 'eccLevel' => $eccLevel->getLevel()]), [new $dataModeInterface($data)]));
- printf('%s encode: % 6.3fms', $key, $test->getResult());
- $json[$dataModeName][(string)$eccLevel]['encode'][$version] = $test->getResult();
- // writeMatrix includes QRMatrix::writeCodewords() and the ReedSolomonEncoder
- $qrdata = new QRData(new QROptions(['version' => $version, 'eccLevel' => $eccLevel->getLevel()]), [new $dataModeInterface($data)]);
- $test->run(fn() => $qrdata->writeMatrix());
- printf(', write matrix: % 6.3fms', $test->getResult());
- $json[$dataModeName][(string)$eccLevel]['write'][$version] = $test->getResult();
- $bitBuffer = $qrdata->getBitBuffer();
- $bitBuffer->read(4); // read data mode indicator
- $test->run(fn() => $dataModeInterface::decodeSegment(clone $bitBuffer, $version));
- printf(", decode: % 6.3fms\n", $test->getResult());
- $json[$dataModeName][(string)$eccLevel]['decode'][$version] = $test->getResult();
- }
- file_put_contents(__DIR__.'/performance_qrdata.json', json_encode($json, JSON_PRETTY_PRINT));
|