parse-common.php 2.0 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778
  1. <?php
  2. /**
  3. * @created 27.04.2024
  4. * @author smiley <smiley@chillerlan.net>
  5. * @copyright 2024 smiley
  6. * @license MIT
  7. */
  8. declare(strict_types=1);
  9. namespace chillerlan\QRCodeBenchmark;
  10. use function array_column;
  11. use function array_key_first;
  12. use function array_keys;
  13. use function array_map;
  14. use function array_sum;
  15. use function explode;
  16. use function implode;
  17. use function intdiv;
  18. use function rsort;
  19. use function sprintf;
  20. use function str_repeat;
  21. use const SORT_NUMERIC;
  22. const BUILDDIR = __DIR__.'/../.build/phpbench';
  23. const FILE = BUILDDIR.'/benchmark'; // without extension
  24. function parseVariants(array $variants):string{
  25. $data = [];
  26. foreach($variants as $variant){
  27. [$version, $ecc, $mode] = explode(',', $variant['name']);
  28. $data[(int)$version][$mode][$ecc] = parseVariantResults($variant['results']);
  29. }
  30. $v = $data[array_key_first($data)];
  31. $modeKeys = array_keys($v);
  32. $eccKeys = array_keys($v[$modeKeys[0]]);
  33. $modeHeaders = array_map(fn($mode) => sprintf('<th colspan="4">%s</th>', $mode), $modeKeys);
  34. $eccHeaders = array_map(fn($ecc) => sprintf('<th>%s</th>', $ecc), $eccKeys);
  35. $table = ['<table><thead>'];
  36. $table[] = sprintf('<tr><th></th>%s</tr>', implode('', $modeHeaders));
  37. $table[] = sprintf('<tr><th>Version</th>%s</tr>', str_repeat(implode('', $eccHeaders), count($modeKeys)));
  38. $table[] = '</thead><tbody>';
  39. foreach($data as $version => $modes){
  40. $results = [];
  41. foreach($modes as $eccLevels){
  42. foreach($eccLevels as [$time_avg, $mem_peak]){
  43. $results[] = sprintf('<td>%01.3f</td>', $time_avg);
  44. }
  45. }
  46. $table[] = sprintf('<tr><td>%s</td>%s</tr>', $version, implode('', $results));
  47. }
  48. $table[] = '</tbody></table>';
  49. return implode("\n", $table);
  50. }
  51. function parseVariantResults(array $results):array{
  52. $iterations = count($results);
  53. $mem_peak = array_column($results, 'mem_peak');
  54. rsort($mem_peak, SORT_NUMERIC);
  55. return [
  56. (array_sum(array_column($results, 'time_avg')) / $iterations / 1000),
  57. intdiv($mem_peak[0], 1024),
  58. ];
  59. }