PHP: comma vs. dot #2

3月 10, 2012 Computer, Programming
(Last Updated On: 2018年8月13日)

少し前にPHPのechoはカンマとドット、どちらの方が速い?というエントリを書きました。

echo:comma vs dot

この時は長めの細切れな文字列を連結しています。カンマの方が2割ほど速い結果でした。古いPHPでは短く単純な文字列の場合もで速かった、と記憶していました。手元のPHP5.3の性能が気になったのでabで簡単に試してみました。

<?php echo ‘aaaaaaaaaaaaaaaaaaa’, ‘bbbbbbbbbbbbbbbbbbb’, PHP_EOL ?>

Requests per second:    4409.19 [#/sec] (mean)

<?php echo ‘aaaaaaaaaaaaaaaaaaa’. ‘bbbbbbbbbbbbbbbbbbb’. PHP_EOL ?>

Requests per second:    3712.72 [#/sec] (mean)

 

このケースでもおよそ2割ほどカンマの方が速い結果となりました。

追記: ソースコードからはほぼ同じ速度になってもおかしくないかも、と思える部分があったのでもう少しだけテストしてみました。同じPC上でabとApacheを動作させていたのですが、繰り返し実行してみると予想以上にかなり結果にばらつきがありました。正確に記録をとって比較していないので感覚的にですが、1割くらい速いような感じでした。

以下のように更に短く単純な文字列にしてみると

<?php echo ‘a’,’b’,PHP_EOL ?>

ほぼ同じかもしかするとドットで連結した方が速いかも、と思える結果でした。

PHPのベンチマークをよく取っている方なら細かく正確なベンチマークをあまり意味の無いことを良くご存知だと思います。単機能、単純なベンチマークはマイナーバージョンが違うだけでもかなり異なる事が多く、実際に自分の環境で速くなるかは分からないからです。(もともとベンチマークとはそういう物ですけどね)

これらの結果から推測すると、出力をキャッシュしていないアプリならカンマに換えるだけで計測できるくらいの差が出ることが多いと考えられます。しかし、かならず有意なほどの速度差がでる、とは限らないので態々カンマをドットに書き換えるような作業はあまりお薦めできません。

 

少し長い文字列を利用した場合のabコマンドの出力結果

[yohgaki@dev public_html]$ ab -c 100 -n 10000 http://yohgaki/echo.php
This is ApacheBench, Version 2.3 <$Revision: 655654 $>
Copyright 1996 Adam Twiss, Zeus Technology Ltd, http://www.zeustech.net/
Licensed to The Apache Software Foundation, http://www.apache.org/

Benchmarking yohgaki (be patient)
Completed 1000 requests
Completed 2000 requests
Completed 3000 requests
Completed 4000 requests
Completed 5000 requests
Completed 6000 requests
Completed 7000 requests
Completed 8000 requests
Completed 9000 requests
Completed 10000 requests
Finished 10000 requests

Server Software:        Apache/2.2.21
Server Hostname:        yohgaki
Server Port:            80

Document Path:          /echo.php
Document Length:        39 bytes

Concurrency Level:      100
Time taken for tests:   2.268 seconds
Complete requests:      10000
Failed requests:        0
Write errors:           0
Total transferred:      2320000 bytes
HTML transferred:       390000 bytes
Requests per second:    4409.19 [#/sec] (mean)
Time per request:       22.680 [ms] (mean)
Time per request:       0.227 [ms] (mean, across all concurrent requests)
Transfer rate:          998.96 [Kbytes/sec] received

Connection Times (ms)
min  mean[+/-sd] median   max
Connect:        0    0   0.3      0       4
Processing:     3   22   4.6     21      42
Waiting:        3   22   4.6     21      42
Total:          7   23   4.6     22      42

Percentage of the requests served within a certain time (ms)
50%     22
66%     24
75%     26
80%     27
90%     28
95%     30
98%     33
99%     37
100%     42 (longest request)

 

 

[yohgaki@dev public_html]$ ab -c 100 -n 10000 http://yohgaki/echo.php
This is ApacheBench, Version 2.3 <$Revision: 655654 $>
Copyright 1996 Adam Twiss, Zeus Technology Ltd, http://www.zeustech.net/
Licensed to The Apache Software Foundation, http://www.apache.org/

Benchmarking yohgaki (be patient)
Completed 1000 requests
Completed 2000 requests
Completed 3000 requests
Completed 4000 requests
Completed 5000 requests
Completed 6000 requests
Completed 7000 requests
Completed 8000 requests
Completed 9000 requests
Completed 10000 requests
Finished 10000 requests

Server Software:        Apache/2.2.21
Server Hostname:        yohgaki
Server Port:            80

Document Path:          /echo.php
Document Length:        39 bytes

Concurrency Level:      100
Time taken for tests:   2.693 seconds
Complete requests:      10000
Failed requests:        0
Write errors:           0
Total transferred:      2320232 bytes
HTML transferred:       390039 bytes
Requests per second:    3712.72 [#/sec] (mean)
Time per request:       26.934 [ms] (mean)
Time per request:       0.269 [ms] (mean, across all concurrent requests)
Transfer rate:          841.25 [Kbytes/sec] received

Connection Times (ms)
min  mean[+/-sd] median   max
Connect:        0    0   0.3      0       4
Processing:    15   27   6.5     24      59
Waiting:       15   26   6.4     24      59
Total:         15   27   6.6     24      62

Percentage of the requests served within a certain time (ms)
50%     24
66%     29
75%     30
80%     31
90%     36
95%     41
98%     46
99%     50
100%     62 (longest request)
[yohgaki@dev public_html]$

投稿者: yohgaki