qrcode.php 2.4 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384
  1. <?php
  2. /**
  3. * Tests the overall performance of the QRCode class
  4. *
  5. * @created 19.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, Mode, Version};
  13. use chillerlan\QRCode\Output\QROutputInterface;
  14. use chillerlan\QRCodeTest\QRMaxLengthTrait;
  15. use Generator;
  16. use function file_put_contents;
  17. use function json_encode;
  18. use function mb_substr;
  19. use function printf;
  20. use function sprintf;
  21. use function str_repeat;
  22. use function str_replace;
  23. use const JSON_PRETTY_PRINT;
  24. require_once __DIR__.'/../../vendor/autoload.php';
  25. // excerpt from QRCodeReaderTestAbstract
  26. $generator = new class () {
  27. use QRMaxLengthTrait;
  28. public function dataProvider():Generator{
  29. $dataModeData = [
  30. Mode::NUMBER => str_repeat('0123456789', 750),
  31. Mode::ALPHANUM => str_repeat('ABCDEFGHIJKLMNOPQRSTUVWXYZ1234567890 $%*+-./:', 100),
  32. Mode::KANJI => str_repeat('漂う花の香り', 350),
  33. Mode::HANZI => str_repeat('无可奈何燃花作香', 250),
  34. Mode::BYTE => str_repeat('https://www.youtube.com/watch?v=dQw4w9WgXcQ ', 100),
  35. ];
  36. foreach(Mode::INTERFACES as $dataMode => $dataModeInterface){
  37. $dataModeName = str_replace('chillerlan\\QRCode\\Data\\', '', $dataModeInterface);
  38. for($v = 1; $v <= 40; $v++){
  39. $version = new Version($v);
  40. foreach([EccLevel::L, EccLevel::M, EccLevel::Q, EccLevel::H] as $ecc){
  41. $eccLevel = new EccLevel($ecc);
  42. yield sprintf('version %2s%s (%s)', $version, $eccLevel, $dataModeName) => [
  43. $version->getVersionNumber(),
  44. $eccLevel,
  45. $dataModeInterface,
  46. $dataModeName,
  47. mb_substr($dataModeData[$dataMode], 0, self::getMaxLengthForMode($dataMode, $version, $eccLevel)),
  48. ];
  49. }
  50. }
  51. }
  52. }
  53. };
  54. $test = new PerformanceTest(100);
  55. $json = [];
  56. foreach($generator->dataProvider() as $key => [$version, $eccLevel, $dataModeInterface, $dataModeName, $data]){
  57. $options = new QROptions([
  58. 'outputType' => QROutputInterface::STRING_JSON,
  59. 'version' => $version,
  60. 'eccLevel' => $eccLevel->getLevel(),
  61. ]);
  62. $test->run(fn() => (new QRCode($options))->addSegment(new $dataModeInterface($data))->render());
  63. printf("%s: %01.3fms\n", $key, $test->getResult());
  64. $json[$dataModeName][(string)$eccLevel][$version] = $test->getResult();
  65. }
  66. file_put_contents(__DIR__.'/performance_qrcode.json', json_encode($json, JSON_PRETTY_PRINT));