generate-html.php 4.0 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149
  1. <?php
  2. /**
  3. * Generates a benchmark report in HTML
  4. *
  5. * @created 30.04.2024
  6. * @author smiley <smiley@chillerlan.net>
  7. * @copyright 2024 smiley
  8. * @license MIT
  9. *
  10. * @phan-file-suppress PhanTypeArraySuspiciousNullable
  11. */
  12. declare(strict_types=1);
  13. namespace chillerlan\QRCodeBenchmark;
  14. use RuntimeException;
  15. use function array_keys;
  16. use function copy;
  17. use function file_exists;
  18. use function file_get_contents;
  19. use function file_put_contents;
  20. use function htmlspecialchars;
  21. use function implode;
  22. use function is_bool;
  23. use function is_dir;
  24. use function json_decode;
  25. use function mkdir;
  26. use function sprintf;
  27. require_once __DIR__.'/parse-common.php';
  28. if(!file_exists(FILE.'.json')){
  29. throw new RuntimeException('invalid benchmark report [file_exists()]');
  30. }
  31. $data = file_get_contents(FILE.'.json');
  32. if($data === false){
  33. throw new RuntimeException('invalid benchmark report [file_get_contents()]');
  34. }
  35. $json = json_decode($data, true);
  36. $htmlHead = '<!DOCTYPE html>
  37. <html lang="en">
  38. <head>
  39. <meta charset="UTF-8">
  40. <meta name="viewport" content="width=device-width, initial-scale=1.0"/>
  41. <link rel="stylesheet" href="./benchmark.css">
  42. <title>%s results</title>
  43. </head>
  44. <body>';
  45. $htmlFoot = '</body>
  46. </html>';
  47. $html = [];
  48. // General information/overview
  49. $env = $json['env'];
  50. $suite = $json['suite'];
  51. $html['index'][] = sprintf($htmlHead, 'Benchmark');
  52. $html['index'][] = '<h1>Benchmark results</h1>';
  53. $html['index'][] = '<h2>Environment</h2>';
  54. $html['index'][] = '<table><thead>';
  55. $html['index'][] = '<tr><th>Name</th><th>Value</th></tr>';
  56. $html['index'][] = '</thead><tbody>';
  57. $html['index'][] = sprintf('<tr><td>date</td><td style="text-align: left;">%s %s</td></tr>', $suite['date'], $suite['time']);
  58. $html['index'][] = sprintf(
  59. '<tr><td>environment</td><td style="text-align: left;">%s %s, %s</td></tr>',
  60. $env['uname_os'],
  61. $env['uname_version'],
  62. $env['uname_machine'],
  63. );
  64. $html['index'][] = sprintf('<tr><td>tag</td><td style="text-align: left;">%s</td></tr>', htmlspecialchars($suite['tag']));
  65. foreach(['php_version', 'php_ini', 'php_extensions', 'php_xdebug', 'opcache_extension_loaded', 'opcache_enabled'] as $field){
  66. // prettify the boolean values
  67. if(is_bool($env[$field])){
  68. $env[$field] = ($env[$field]) ? '✓' : '✗';
  69. }
  70. $html['index'][] = sprintf('<tr><td>%s</td><td style="text-align: left;">%s</td></tr>', $field, $env[$field]);
  71. }
  72. $html['index'][] = '</tbody></table>';
  73. // list indiviidual reports
  74. $html['index'][] = '<h2>Reports</h2>';
  75. $list = [];
  76. foreach(array_keys($json['benchmark']) as $benchmark){
  77. // add a file & header
  78. $html[$benchmark][] = sprintf($htmlHead, $benchmark);
  79. $html[$benchmark][] = sprintf('<h1>%s</h1>', $benchmark);
  80. $html[$benchmark][] = sprintf('<code>%s</code>', $json['benchmark'][$benchmark]['class']);
  81. foreach(array_keys($json['benchmark'][$benchmark]['subjects']) as $subject){
  82. // list item
  83. $list[$benchmark][] = $subject;
  84. $subj = $json['benchmark'][$benchmark]['subjects'][$subject];
  85. $html[$benchmark][] = sprintf('<h2 id="%1$s">%1$s</h2>', $subject);
  86. $html[$benchmark][] = sprintf('<div>Revs: %s, Iterations: %s</div>', $subj['revs'], $subj['iterations']);
  87. $html[$benchmark][] = parseVariants($subj['variants']);
  88. }
  89. // close document
  90. $html[$benchmark][] = '<a class="return" href="./index.html">back to overview</a>';
  91. $html[$benchmark][] = $htmlFoot;
  92. }
  93. // create overview list
  94. $html['index'][] = '<ul>';
  95. foreach($list as $benchmark => $subjects){
  96. // list item
  97. $html['index'][] = sprintf('<li><a href="./%1$s.html">%1$s</a><ul>', $benchmark);
  98. foreach($subjects as $subject){
  99. // list sub-item
  100. $html['index'][] = sprintf('<li><a href="./%1$s.html#%2$s">%2$s</a></li>', $benchmark, $subject);
  101. }
  102. $html['index'][] = '</ul></li>';
  103. }
  104. $html['index'][] = '</ul>';
  105. // close document
  106. $html['index'][] = $htmlFoot;
  107. if(!is_dir(BUILDDIR.'/html/')){
  108. mkdir(BUILDDIR.'/html/');
  109. }
  110. copy(__DIR__.'/benchmark.css', BUILDDIR.'/html/benchmark.css');
  111. foreach($html as $file => $content){
  112. file_put_contents(BUILDDIR.'/html/'.$file.'.html', implode("\n", $content));
  113. }