testPerformance.php 2.2 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081
  1. <?php
  2. declare(strict_types=1);
  3. use JsonMachine\Items;
  4. require_once __DIR__.'/../../vendor/autoload.php';
  5. if ( ! ini_get('xdebug.mode')) {
  6. echo "Xdebug disabled\n";
  7. } else {
  8. echo "Xdebug enabled\n";
  9. }
  10. if ( ! function_exists('opcache_get_status')) {
  11. echo "Opcache disabled\n";
  12. echo "JIT disabled\n";
  13. } else {
  14. echo "Opcache enabled\n";
  15. if (opcache_get_status()['jit']['enabled']) {
  16. echo "JIT enabled\n";
  17. } else {
  18. echo "JIT disabled\n";
  19. }
  20. }
  21. ini_set('memory_limit', '-1'); // for json_decode use case
  22. $decoders = [
  23. 'Items::fromFile()' => function ($file) {
  24. return Items::fromFile($file);
  25. },
  26. 'Items::fromString()' => function ($file) {
  27. return Items::fromString(stream_get_contents(fopen($file, 'r')));
  28. },
  29. 'Items::fromFile() - debug' => function ($file) {
  30. return Items::fromFile($file, ['debug' => true]);
  31. },
  32. 'Items::fromString() - debug' => function ($file) {
  33. return Items::fromString(stream_get_contents(fopen($file, 'r')), ['debug' => true]);
  34. },
  35. 'json_decode()' => function ($file) {
  36. return json_decode(stream_get_contents(fopen($file, 'r')), true);
  37. },
  38. ];
  39. $tmpJsonFileName = createBigJsonFile();
  40. $fileSizeMb = (filesize($tmpJsonFileName) / 1024 / 1024);
  41. echo 'File size: '.round($fileSizeMb, 2),' MB'.PHP_EOL;
  42. foreach ($decoders as $name => $decoder) {
  43. $start = microtime(true);
  44. $result = $decoder($tmpJsonFileName);
  45. if ( ! $result instanceof \Traversable && ! is_array($result)) {
  46. $textResult = 'Decoding error';
  47. } else {
  48. foreach ($result as $key => $item) {
  49. }
  50. $time = microtime(true) - $start;
  51. $textResult = round($fileSizeMb / $time, 2).' MB/s';
  52. }
  53. echo str_pad($name.': ', 37, '.')." $textResult".PHP_EOL;
  54. }
  55. @unlink($tmpJsonFileName);
  56. function createBigJsonFile()
  57. {
  58. $tmpJson = tempnam(sys_get_temp_dir(), 'json_');
  59. $f = fopen($tmpJson, 'w');
  60. $separator = '';
  61. fputs($f, '[');
  62. for ($i = 0; $i < 6000; ++$i) {
  63. fputs($f, $separator);
  64. fputs($f, file_get_contents(__DIR__.'/twitter_example_'.($i % 2).'.json'));
  65. $separator = ",\n\n";
  66. }
  67. fputs($f, ']');
  68. fclose($f);
  69. return $tmpJson;
  70. }