maskpattern.php 1.7 KB

1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253545556575859606162
  1. <?php
  2. /**
  3. * Tests the performance of the mask pattern penalty testing
  4. *
  5. * @created 18.10.2023
  6. * @author smiley <smiley@chillerlan.net>
  7. * @copyright 2023 smiley
  8. * @license MIT
  9. */
  10. namespace chillerlan\QRCodeTest\Performance;
  11. use chillerlan\QRCode\{QRCode, QROptions};
  12. use chillerlan\QRCode\Common\{EccLevel, MaskPattern, Mode, Version};
  13. use chillerlan\QRCodeTest\QRMaxLengthTrait;
  14. use Generator;
  15. use function file_put_contents;
  16. use function json_encode;
  17. use function printf;
  18. use function sprintf;
  19. use function str_repeat;
  20. use function substr;
  21. use const JSON_PRETTY_PRINT;
  22. require_once __DIR__.'/../../vendor/autoload.php';
  23. // excerpt from QRCodeReaderTestAbstract
  24. $generator = new class () {
  25. use QRMaxLengthTrait;
  26. public function dataProvider():Generator{
  27. $str = str_repeat('https://www.youtube.com/watch?v=dQw4w9WgXcQ ', 100);
  28. $eccLevel = new EccLevel(EccLevel::H);
  29. for($v = 1; $v <= 40; $v++){
  30. $version = new Version($v);
  31. yield sprintf('version %2s%s', $version, $eccLevel) => [
  32. $version->getVersionNumber(),
  33. $eccLevel->getLevel(),
  34. substr($str, 0, self::getMaxLengthForMode(Mode::BYTE, $version, $eccLevel)),
  35. ];
  36. }
  37. }
  38. };
  39. $test = new PerformanceTest(100);
  40. $json = [];
  41. foreach($generator->dataProvider() as $key => [$version, $eccLevel, $data]){
  42. $qrcode = new QRCode(new QROptions(['version' => $version, 'eccLevel' => $eccLevel]));
  43. $qrcode->addByteSegment($data);
  44. $matrix = $qrcode->getQRMatrix();
  45. $test->run(fn() => MaskPattern::getBestPattern($matrix));
  46. printf("%s: %01.3fms\n", $key, $test->getResult());
  47. $json[$version] = $test->getResult();
  48. }
  49. file_put_contents(__DIR__.'/performance_maskpattern.json', json_encode($json, JSON_PRETTY_PRINT));