/php/benchmark.php

https://github.com/mostlygeek/msgpack · PHP · 239 lines · 209 code · 19 blank · 11 comment · 27 complexity · 5381f522ccf76f9935e8f0556dd55b53 MD5 · raw file

  1. <?php
  2. $loop = 10000;
  3. $retry = 10;
  4. $value_display = false;
  5. $types = array(
  6. 1, //integer
  7. 2, //float
  8. 3, //string
  9. 4, //array
  10. 5, //hash
  11. 6, //object
  12. );
  13. foreach ($types as $type)
  14. {
  15. switch ($type)
  16. {
  17. case 1:
  18. //integer
  19. $value = rand();
  20. break;
  21. case 2:
  22. //float
  23. $value = log(rand());
  24. break;
  25. case 3:
  26. //string
  27. $value = md5(rand());
  28. break;
  29. case 4:
  30. //array
  31. $value = array(md5(rand()),
  32. md5(rand()),
  33. md5(rand()),
  34. md5(rand()),
  35. md5(rand()));
  36. break;
  37. case 5:
  38. //hash
  39. $value = array(md5(rand()) => md5(rand()),
  40. md5(rand()) => md5(rand()),
  41. md5(rand()) => md5(rand()),
  42. md5(rand()) => md5(rand()),
  43. md5(rand()) => md5(rand()));
  44. break;
  45. case 6:
  46. //object
  47. $value = new stdClass;
  48. $value->param1 = rand();
  49. $value->param2 = md5(uniqid());
  50. $value->param3 = array(md5(uniqid()));
  51. $value->param4 = array(md5(uniqid()) => md5(uniqid()));
  52. $value->param5 = null;
  53. break;
  54. default:
  55. //null
  56. $value = null;
  57. }
  58. if (!is_numeric($retry) || empty($retry))
  59. {
  60. $retry = 1;
  61. }
  62. $serialize_pack = 0;
  63. $serialize_unpack = 0;
  64. $serialize_size = 0;
  65. $serialize_status = '*NG*';
  66. $json_pack = 0;
  67. $json_unpack = 0;
  68. $json_size = 0;
  69. $json_status = '*NG*';
  70. $igbinary_pack = 0;
  71. $igbinary_unpack = 0;
  72. $igbinary_size = 0;
  73. $igbinary_status = '*NG*';
  74. $msgpack_pack = 0;
  75. $msgpack_unpack = 0;
  76. $msgpack_size = 0;
  77. $msgpack_status = '*NG*';
  78. for ($c = 0; $c < $retry; $c++)
  79. {
  80. //default (serialize)
  81. $pack = null;
  82. $unpack = null;
  83. $start = microtime(true);
  84. for ($i = 0; $i < $loop; $i++)
  85. {
  86. $pack = serialize($value);
  87. }
  88. $end = microtime(true);
  89. $serialize_pack += ($end - $start);
  90. $start = microtime(true);
  91. for ($i = 0; $i < $loop; $i++)
  92. {
  93. $unpack = unserialize($pack);
  94. }
  95. $end = microtime(true);
  96. $serialize_unpack += ($end - $start);
  97. $serialize_size += strlen($pack);
  98. if ($unpack === $value ||
  99. (is_object($value) && $unpack == $value))
  100. {
  101. $serialize_status = 'OK';
  102. }
  103. //json
  104. $pack = null;
  105. $unpack = null;
  106. $opt = false;
  107. if (is_array($value))
  108. {
  109. $opt = true;
  110. }
  111. $start = microtime(true);
  112. for ($i = 0; $i < $loop; $i++)
  113. {
  114. $pack = json_encode($value);
  115. }
  116. $end = microtime(true);
  117. $json_pack += ($end - $start);
  118. $start = microtime(true);
  119. for ($i = 0; $i < $loop; $i++)
  120. {
  121. $unpack = json_decode($pack, $opt);
  122. }
  123. $end = microtime(true);
  124. $json_unpack += ($end - $start);
  125. $json_size += strlen($pack);
  126. if ($unpack === $value ||
  127. (is_object($value) && $unpack == $value) ||
  128. (is_float($value) &&
  129. number_format($value, 10, '.', '') ===
  130. number_format($unpack, 10, '.', '')))
  131. {
  132. $json_status = 'OK';
  133. }
  134. //igbinary
  135. if (extension_loaded('igbinary'))
  136. {
  137. $pack = null;
  138. $unpack = null;
  139. $start = microtime(true);
  140. for ($i = 0; $i < $loop; $i++)
  141. {
  142. $pack = igbinary_serialize($value);
  143. }
  144. $end = microtime(true);
  145. $igbinary_pack += ($end - $start);
  146. $start = microtime(true);
  147. for ($i = 0; $i < $loop; $i++)
  148. {
  149. $unpack = igbinary_unserialize($pack);
  150. }
  151. $end = microtime(true);
  152. $igbinary_unpack += ($end - $start);
  153. $igbinary_size += strlen($pack);
  154. if ($unpack === $value ||
  155. (is_object($value) && $unpack == $value))
  156. {
  157. $igbinary_status = 'OK';
  158. }
  159. }
  160. //msgpack
  161. $pack = null;
  162. $unpack = null;
  163. $start = microtime(true);
  164. for ($i = 0; $i < $loop; $i++)
  165. {
  166. $pack = msgpack_serialize($value);
  167. }
  168. $end = microtime(true);
  169. $msgpack_pack += ($end - $start);
  170. $start = microtime(true);
  171. for ($i = 0; $i < $loop; $i++)
  172. {
  173. $unpack = msgpack_unserialize($pack);
  174. }
  175. $end = microtime(true);
  176. $msgpack_unpack += ($end - $start);
  177. $msgpack_size += strlen($pack);
  178. if ($unpack === $value ||
  179. (is_object($value) && $unpack == $value))
  180. {
  181. $msgpack_status = 'OK';
  182. }
  183. }
  184. $serialize_pack /= $retry;
  185. $serialize_unpack /= $retry;
  186. $serialize_size /= $retry;
  187. $json_pack /= $retry;
  188. $json_unpack /= $retry;
  189. $json_size /= $retry;
  190. $igbinary_pack /= $retry;
  191. $igbinary_unpack /= $retry;
  192. $igbinary_size /= $retry;
  193. $msgpack_pack /= $retry;
  194. $msgpack_unpack /= $retry;
  195. $msgpack_size /= $retry;
  196. printf("[%-10s] %13s %13s %13s %13s\n",
  197. gettype($value), 'default', 'json', 'igbinary', 'msgpack');
  198. printf("status : %12s %12s %12s %12s\n",
  199. $serialize_status, $json_status, $igbinary_status, $msgpack_status);
  200. printf("serialize : %.4f (100%%) %.4f (%3d%%) %.4f (%3d%%) %.4f (%3d%%)\n",
  201. $serialize_pack,
  202. $json_pack, ($json_pack / $serialize_pack * 100),
  203. $igbinary_pack, ($igbinary_pack / $serialize_pack * 100),
  204. $msgpack_pack, ($msgpack_pack / $serialize_pack * 100));
  205. printf("unserialize: %.4f (100%%) %.4f (%3d%%) %.4f (%3d%%) %.4f (%3d%%)\n",
  206. $serialize_unpack,
  207. $json_unpack, ($json_unpack / $serialize_unpack * 100),
  208. $igbinary_unpack, ($igbinary_unpack / $serialize_unpack * 100),
  209. $msgpack_unpack, ($msgpack_unpack / $serialize_unpack * 100));
  210. printf("size : %6d (100%%) %6d (%3d%%) %6d (%3d%%) %6d (%3d%%)\n\n",
  211. $serialize_size,
  212. $json_size, ($json_size / $serialize_size * 100),
  213. $igbinary_size, ($igbinary_size / $serialize_size * 100),
  214. $msgpack_size, ($msgpack_size / $serialize_size * 100));
  215. if ($value_display === true)
  216. {
  217. var_dump($value);
  218. echo PHP_EOL;
  219. }
  220. }