summaryrefslogtreecommitdiff
path: root/php/benchmark.php
blob: 559801cb7015e37a59d99a1294c75fdf37f669e4 (plain)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
192
193
194
195
196
197
198
199
200
201
202
203
204
205
206
207
208
209
210
211
212
213
214
215
216
217
218
219
220
221
222
223
224
225
226
227
228
229
230
231
232
233
234
235
236
237
238
239
240
241
242
243
244
245
246
247
248
<?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;
    }
}