mirror of
				https://github.com/msgpack/msgpack-c.git
				synced 2025-10-27 11:06:51 +01:00 
			
		
		
		
	
		
			
				
	
	
		
			249 lines
		
	
	
		
			7.0 KiB
		
	
	
	
		
			PHP
		
	
	
	
	
	
			
		
		
	
	
			249 lines
		
	
	
		
			7.0 KiB
		
	
	
	
		
			PHP
		
	
	
	
	
	
| <?php
 | |
| require_once 'Benchmark/Timer.php';
 | |
| 
 | |
| $loop = 10000;
 | |
| $retry = 10;
 | |
| $value_display = false;
 | |
| 
 | |
| $types = array(
 | |
|     1, //integer
 | |
|     2, //float
 | |
|     3, //string
 | |
|     4, //array
 | |
|     5, //hash
 | |
|     6, //object
 | |
| );
 | |
| 
 | |
| foreach ($types as $type)
 | |
| {
 | |
|     switch ($type)
 | |
|     {
 | |
|         case 1:
 | |
|             //integer
 | |
|             $value = rand();
 | |
|             break;
 | |
|         case 2:
 | |
|             //float
 | |
|             $value = log(rand());
 | |
|             break;
 | |
|         case 3:
 | |
|             //string
 | |
|             $value = md5(rand());
 | |
|             break;
 | |
|         case 4:
 | |
|             //array
 | |
|             $value = array(md5(rand()),
 | |
|                            md5(rand()),
 | |
|                            md5(rand()),
 | |
|                            md5(rand()),
 | |
|                            md5(rand()));
 | |
|             break;
 | |
|         case 5:
 | |
|             //hash
 | |
|             $value = array(md5(rand()) => md5(rand()),
 | |
|                            md5(rand()) => md5(rand()),
 | |
|                            md5(rand()) => md5(rand()),
 | |
|                            md5(rand()) => md5(rand()),
 | |
|                            md5(rand()) => md5(rand()));
 | |
|             break;
 | |
|         case 6:
 | |
|             //object
 | |
|             $value = new stdClass;
 | |
|             $value->param1 = rand();
 | |
|             $value->param2 = md5(uniqid());
 | |
|             $value->param3 = array(md5(uniqid()));
 | |
|             $value->param4 = array(md5(uniqid()) => md5(uniqid()));
 | |
|             $value->param5 = null;
 | |
|             break;
 | |
|         default:
 | |
|             //null
 | |
|             $value = null;
 | |
|     }
 | |
| 
 | |
|     if (!is_numeric($retry) || empty($retry))
 | |
|     {
 | |
|         $retry = 1;
 | |
|     }
 | |
| 
 | |
|     $serialize_pack = 0;
 | |
|     $serialize_unpack = 0;
 | |
|     $serialize_size = 0;
 | |
|     $serialize_status = '*NG*';
 | |
|     $json_pack = 0;
 | |
|     $json_unpack = 0;
 | |
|     $json_size = 0;
 | |
|     $json_status = '*NG*';
 | |
|     $igbinary_pack = 0;
 | |
|     $igbinary_unpack = 0;
 | |
|     $igbinary_size = 0;
 | |
|     $igbinary_status = '*NG*';
 | |
|     $msgpack_pack = 0;
 | |
|     $msgpack_unpack = 0;
 | |
|     $msgpack_size = 0;
 | |
|     $msgpack_status = '*NG*';
 | |
| 
 | |
|     for ($c = 0; $c < $retry; $c++)
 | |
|     {
 | |
|         //default (serialize)
 | |
|         $pack = null;
 | |
|         $unpack = null;
 | |
|         $t = new Benchmark_Timer;
 | |
|         $t->start();
 | |
|         for ($i = 0; $i < $loop; $i++)
 | |
|         {
 | |
|             $pack = serialize($value);
 | |
|         }
 | |
|         $t->setMarker('serialize');
 | |
|         for ($i = 0; $i < $loop; $i++)
 | |
|         {
 | |
|             $unpack = unserialize($pack);
 | |
|         }
 | |
|         $t->stop();
 | |
|         //$t->display();
 | |
|         $profiling = $t->getProfiling();
 | |
|         unset($t);
 | |
| 
 | |
|         $serialize_pack += $profiling[1]['diff'];
 | |
|         $serialize_unpack += $profiling[2]['diff'];
 | |
|         $serialize_size += strlen($pack);
 | |
|         if ($unpack === $value ||
 | |
|             (is_object($value) && $unpack == $value))
 | |
|         {
 | |
|             $serialize_status = 'OK';
 | |
|         }
 | |
| 
 | |
|         //json
 | |
|         $pack = null;
 | |
|         $unpack = null;
 | |
|         $opt = false;
 | |
|         if (is_array($value))
 | |
|         {
 | |
|             $opt = true;
 | |
|         }
 | |
|         $t = new Benchmark_Timer;
 | |
|         $t->start();
 | |
|         for ($i = 0; $i < $loop; $i++)
 | |
|         {
 | |
|             $pack = json_encode($value);
 | |
|         }
 | |
|         $t->setMarker('json_encode');
 | |
|         for ($i = 0; $i < $loop; $i++)
 | |
|         {
 | |
|             $unpack = json_decode($pack, $opt);
 | |
|         }
 | |
|         $t->stop();
 | |
|         //$t->display();
 | |
|         $profiling = $t->getProfiling();
 | |
|         unset($t);
 | |
| 
 | |
|         $json_pack += $profiling[1]['diff'];
 | |
|         $json_unpack += $profiling[2]['diff'];
 | |
|         $json_size += strlen($pack);
 | |
|         if ($unpack === $value ||
 | |
|             (is_object($value) && $unpack == $value) ||
 | |
|             (is_float($value) &&
 | |
|              number_format($value, 10, '.', '') ===
 | |
|              number_format($unpack, 10, '.', '')))
 | |
|         {
 | |
|             $json_status = 'OK';
 | |
|         }
 | |
| 
 | |
|         //igbinary
 | |
|         if (extension_loaded('igbinary'))
 | |
|         {
 | |
|             $pack = null;
 | |
|             $unpack = null;
 | |
|             $t = new Benchmark_Timer;
 | |
|             $t->start();
 | |
|             for ($i = 0; $i < $loop; $i++)
 | |
|             {
 | |
|                 $pack = igbinary_serialize($value);
 | |
|             }
 | |
|             $t->setMarker('igbinary_serialize');
 | |
|             for ($i = 0; $i < $loop; $i++)
 | |
|             {
 | |
|                 $unpack = igbinary_unserialize($pack);
 | |
|             }
 | |
|             $t->stop();
 | |
|             //$t->display();
 | |
|             $profiling = $t->getProfiling();
 | |
|             unset($t);
 | |
| 
 | |
|             $igbinary_pack += $profiling[1]['diff'];
 | |
|             $igbinary_unpack += $profiling[2]['diff'];
 | |
|             $igbinary_size += strlen($pack);
 | |
|             if ($unpack === $value ||
 | |
|                 (is_object($value) && $unpack == $value))
 | |
|             {
 | |
|                 $igbinary_status = 'OK';
 | |
|             }
 | |
|         }
 | |
| 
 | |
|         //msgpack
 | |
|         $pack = null;
 | |
|         $unpack = null;
 | |
|         $t = new Benchmark_Timer;
 | |
|         $t->start();
 | |
|         for ($i = 0; $i < $loop; $i++)
 | |
|         {
 | |
|             $pack = msgpack_serialize($value);
 | |
|         }
 | |
|         $t->setMarker('msgpack_serialize');
 | |
|         for ($i = 0; $i < $loop; $i++)
 | |
|         {
 | |
|             $unpack = msgpack_unserialize($pack);
 | |
|         }
 | |
|         $t->stop();
 | |
|         //$t->display();
 | |
|         $profiling = $t->getProfiling();
 | |
|         unset($t);
 | |
| 
 | |
|         $msgpack_pack += $profiling[1]['diff'];
 | |
|         $msgpack_unpack += $profiling[2]['diff'];
 | |
|         $msgpack_size += strlen($pack);
 | |
|         if ($unpack === $value ||
 | |
|             (is_object($value) && $unpack == $value))
 | |
|         {
 | |
|             $msgpack_status = 'OK';
 | |
|         }
 | |
|     }
 | |
| 
 | |
|     $serialize_pack /= $retry;
 | |
|     $serialize_unpack /= $retry;
 | |
|     $serialize_size /= $retry;
 | |
|     $json_pack /= $retry;
 | |
|     $json_unpack /= $retry;
 | |
|     $json_size /= $retry;
 | |
|     $igbinary_pack /= $retry;
 | |
|     $igbinary_unpack /= $retry;
 | |
|     $igbinary_size /= $retry;
 | |
|     $msgpack_pack /= $retry;
 | |
|     $msgpack_unpack /= $retry;
 | |
|     $msgpack_size /= $retry;
 | |
| 
 | |
|     printf("[%-10s] %13s %13s %13s %13s\n",
 | |
|            gettype($value), 'default', 'json', 'igbinary', 'msgpack');
 | |
|     printf("status     : %12s  %12s  %12s  %12s\n",
 | |
|            $serialize_status, $json_status, $igbinary_status, $msgpack_status);
 | |
|     printf("serialize  : %.4f (100%%) %.4f (%3d%%) %.4f (%3d%%) %.4f (%3d%%)\n",
 | |
|            $serialize_pack,
 | |
|            $json_pack, ($json_pack / $serialize_pack * 100),
 | |
|            $igbinary_pack, ($igbinary_pack / $serialize_pack * 100),
 | |
|            $msgpack_pack, ($msgpack_pack / $serialize_pack * 100));
 | |
|     printf("unserialize: %.4f (100%%) %.4f (%3d%%) %.4f (%3d%%) %.4f (%3d%%)\n",
 | |
|            $serialize_unpack,
 | |
|            $json_unpack, ($json_unpack / $serialize_unpack * 100),
 | |
|            $igbinary_unpack, ($igbinary_unpack / $serialize_unpack * 100),
 | |
|            $msgpack_unpack, ($msgpack_unpack / $serialize_unpack * 100));
 | |
|     printf("size       : %6d (100%%) %6d (%3d%%) %6d (%3d%%) %6d (%3d%%)\n\n",
 | |
|            $serialize_size,
 | |
|            $json_size, ($json_size / $serialize_size * 100),
 | |
|            $igbinary_size, ($igbinary_size / $serialize_size * 100),
 | |
|            $msgpack_size, ($msgpack_size / $serialize_size * 100));
 | |
|     if ($value_display === true)
 | |
|     {
 | |
|         var_dump($value);
 | |
|         echo PHP_EOL;
 | |
|     }
 | |
| }
 | 
