IconTest 3.8 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137
  1. #!/usr/bin/env php
  2. <?php
  3. define('ITERATIONS', 100000);
  4. require dirname(__FILE__) . DIRECTORY_SEPARATOR . '..' . DIRECTORY_SEPARATOR . 'vendor' . DIRECTORY_SEPARATOR . 'autoload.php';
  5. use Identicon\Generator\GdGenerator;
  6. use Identicon\Generator\ImageMagickGenerator;
  7. use Identicon\Generator\SvgGenerator;
  8. use Identicon\Identicon;
  9. use Jdenticon\Identicon as Jdenticon;
  10. use PrivateBin\Vizhash16x16;
  11. $vizhash = new Vizhash16x16();
  12. $identiconGenerators = array(
  13. 'identicon GD' => new Identicon(new GdGenerator()),
  14. 'identicon ImageMagick' => new Identicon(new ImageMagickGenerator()),
  15. 'identicon SVG' => new Identicon(new SvgGenerator()),
  16. );
  17. $jdenticon = new Jdenticon(array(
  18. 'size' => 16,
  19. 'style' => array(
  20. 'backgroundColor' => '#fff0', // fully transparent, for dark mode
  21. 'padding' => 0,
  22. ),
  23. ));
  24. $jdenticonGenerators = array(
  25. 'jdenticon GD' => 'png',
  26. 'jdenticon SVG' => 'svg',
  27. );
  28. $results = array(
  29. 'vizhash' => array(
  30. 'lengths' => array(),
  31. 'time' => 0
  32. ),
  33. 'identicon GD' => array(
  34. 'lengths' => array(),
  35. 'time' => 0
  36. ),
  37. 'identicon ImageMagick' => array(
  38. 'lengths' => array(),
  39. 'time' => 0
  40. ),
  41. 'identicon SVG' => array(
  42. 'lengths' => array(),
  43. 'time' => 0
  44. ),
  45. 'jdenticon GD' => array(
  46. 'lengths' => array(),
  47. 'time' => 0
  48. ),
  49. 'jdenticon SVG' => array(
  50. 'lengths' => array(),
  51. 'time' => 0
  52. ),
  53. );
  54. $hmacs = array();
  55. echo 'generate ', ITERATIONS, ' hmacs and pre-populate the result array, so tests wont be slowed down', PHP_EOL;
  56. for ($i = 0; $i < ITERATIONS; ++$i) {
  57. $hmacs[$i] = hash_hmac('sha512', '127.0.0.1', bin2hex(random_bytes(256)));
  58. foreach (array_keys($results) as $test) {
  59. $results[$test]['lengths'][$i] = 0;
  60. }
  61. }
  62. echo 'run vizhash tests', PHP_EOL;
  63. $start = microtime(true);
  64. foreach ($hmacs as $i => $hmac) {
  65. $data = 'data:image/png;base64,' . base64_encode(
  66. $vizhash->generate($hmac)
  67. );
  68. $results['vizhash']['lengths'][$i] = strlen($data);
  69. }
  70. $results['vizhash']['time'] = microtime(true) - $start;
  71. foreach ($identiconGenerators as $key => $identicon) {
  72. echo 'run ', $key,' tests', PHP_EOL;
  73. $start = microtime(true);
  74. foreach ($hmacs as $i => $hmac) {
  75. $data = $identicon->getImageDataUri($hmac, 16);
  76. $results[$key]['lengths'][$i] = strlen($data);
  77. }
  78. $results[$key]['time'] = microtime(true) - $start;
  79. }
  80. foreach ($jdenticonGenerators as $key => $format) {
  81. echo 'run ', $key,' tests', PHP_EOL;
  82. $start = microtime(true);
  83. foreach ($hmacs as $i => $hmac) {
  84. $jdenticon->setHash($hmac);
  85. $data = $jdenticon->getImageDataUri($format);
  86. $results[$key]['lengths'][$i] = strlen($data);
  87. }
  88. $results[$key]['time'] = microtime(true) - $start;
  89. }
  90. define(
  91. 'PADDING_LENGTH',
  92. max(
  93. array_map(
  94. function ($key) {
  95. return strlen($key);
  96. },
  97. array_keys($results)
  98. )
  99. ) + 1
  100. );
  101. function format_result_line($generator, $min, $max, $avg, $sec) {
  102. echo str_pad($generator, PADDING_LENGTH, ' '), "\t",
  103. str_pad($min, 4, ' ', STR_PAD_LEFT), "\t",
  104. str_pad($max, 4, ' ', STR_PAD_LEFT), "\t",
  105. str_pad($avg, 4, ' ', STR_PAD_LEFT), "\t",
  106. str_pad($sec, 7, ' ', STR_PAD_LEFT), PHP_EOL;
  107. }
  108. echo PHP_EOL;
  109. format_result_line('Generator:', 'min', 'max', 'avg', 'seconds');
  110. format_result_line(
  111. str_repeat('─', PADDING_LENGTH), str_repeat('─', 4), str_repeat('─', 4),
  112. str_repeat('─', 4), str_repeat('─', 7)
  113. );
  114. foreach ($results as $generator => $result) {
  115. sort($result['lengths']);
  116. format_result_line(
  117. $generator . ':',
  118. $result['lengths'][0],
  119. $result['lengths'][ITERATIONS-1],
  120. round(array_sum($result['lengths']) / ITERATIONS),
  121. round($result['time'], 3)
  122. );
  123. }