parse-common.php 2.1 KB

1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253545556575859606162636465666768697071727374757677787980818283848586
  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. /**
  25. * @param array<int, array<int, mixed>> $variants
  26. */
  27. function parseVariants(array $variants):string{
  28. $data = [];
  29. foreach($variants as $variant){
  30. [$version, $ecc, $mode] = explode(',', $variant['name']);
  31. $data[(int)$version][$mode][$ecc] = parseVariantResults($variant['results']);
  32. }
  33. $v = $data[array_key_first($data)];
  34. $modeKeys = array_keys($v);
  35. $eccKeys = array_keys($v[$modeKeys[0]]);
  36. $modeHeaders = array_map(fn($mode) => sprintf('<th colspan="4">%s</th>', $mode), $modeKeys);
  37. $eccHeaders = array_map(fn($ecc) => sprintf('<th>%s</th>', $ecc), $eccKeys);
  38. $table = ['<table><thead>'];
  39. $table[] = sprintf('<tr><th></th>%s</tr>', implode('', $modeHeaders));
  40. $table[] = sprintf('<tr><th>Version</th>%s</tr>', str_repeat(implode('', $eccHeaders), count($modeKeys)));
  41. $table[] = '</thead><tbody>';
  42. foreach($data as $version => $modes){
  43. $results = [];
  44. foreach($modes as $eccLevels){
  45. foreach($eccLevels as [$time_avg, $mem_peak]){
  46. $results[] = sprintf('<td>%01.3f</td>', $time_avg);
  47. }
  48. }
  49. $table[] = sprintf('<tr><td>%s</td>%s</tr>', $version, implode('', $results));
  50. }
  51. $table[] = '</tbody></table>';
  52. return implode("\n", $table);
  53. }
  54. /**
  55. * @param array<int, array<int, mixed>> $results
  56. *
  57. * @return array{0: float, 1: int}
  58. */
  59. function parseVariantResults(array $results):array{
  60. $iterations = count($results);
  61. $mem_peak = array_column($results, 'mem_peak');
  62. rsort($mem_peak, SORT_NUMERIC);
  63. return [
  64. (array_sum(array_column($results, 'time_avg')) / $iterations / 1000),
  65. intdiv($mem_peak[0], 1024),
  66. ];
  67. }