echo は , か . かって話
ふとしたことから, echo は , で連結(, の場合連結ではないんですけど)か,. で連結かって話がでて白熱したんですが.
要するに,
<?php $hoge = 'hoge'; echo $hoge, PHP_EOL; echo $hoge . PHP_EOL;
どっちだ,って話です.
突き詰めていくと,議論は
- 好み
- どっちだっていい
- プロジェクトのコーディング規約にあわせろ
- 慣れ
- どうでもいい
あたりに落ち着くんですが(落ち着いていない).つまり,vim/emacs, タブ/スペース,きのこ/たけのこ にならぶ,プログラマー宗教論争のようなものですね.
まあ個人的な主張としては,
- echo は言語構造で,「出力」が目的なら出力対象を列挙すべき
- , は使ってる人があんまいない(なぜなら僕も入門書で . を使っていたで覚えて以来ずっと . だったし).だから,マイノリティはカッコイイから , がいい(←
- きっと文字列連結で余計なメモリアロケートが発生しないから速いんじゃないか
あたりでした.
検証
ま,どうでもいいんですが,速度の面は気になったので以下検証.
- カンマとドットで比較
- 連結する文字列の長さを変える
- 連結する回数を変える
- time で測定
- スクリプトなど: http://github.com/sotarok/sandbox/tree/master/php/echo/
<?php // 基本はこんなかんじ <?php for ($i = 0; $i < 10000000; ++$i) { echo $i, PHP_EOL; // ここを, にするか . にするか的な }
以下結果.
% ./test.sh dot 7.79user 1.16system 0:09.05elapsed 98%CPU (0avgtext+0avgdata 0maxresident)k 0inputs+0outputs (0major+2872minor)pagefaults 0swaps comma 8.02user 2.69system 0:10.79elapsed 99%CPU (0avgtext+0avgdata 0maxresident)k 0inputs+0outputs (0major+2870minor)pagefaults 0swaps dot (10 times join) 38.59user 1.24system 0:40.32elapsed 98%CPU (0avgtext+0avgdata 0maxresident)k 0inputs+0outputs (0major+2873minor)pagefaults 0swaps comma (10 times join) 44.74user 11.77system 0:57.00elapsed 99%CPU (0avgtext+0avgdata 0maxresident)k 0inputs+0outputs (0major+2871minor)pagefaults 0swaps dot (long string) 8.84user 1.00system 0:09.88elapsed 99%CPU (0avgtext+0avgdata 0maxresident)k 0inputs+0outputs (0major+2870minor)pagefaults 0swaps comma (long string) 5.85user 2.14system 0:08.03elapsed 99%CPU (0avgtext+0avgdata 0maxresident)k 0inputs+0outputs (0major+2872minor)pagefaults 0swaps
結論
ということで,
いあ、たぶん(って測れよってはなしだけど)カンマでつなぐとzend_do_echoがつないだ数だけよばれる -> ZEND_ECHOなopcodeが詰まれる -> php_printf()が(ry、でphp_printf()が遅そう、っていう。
Twitter / masaki_fujimoto: いあ、たぶん(って測れよってはなしだけど)カンマでつなぐとz ...
@sotarok できっと短いのたくさん連結すると"."が速いし、文字列が長くなってくると","が速いしメモリに優しいので、すてきなセンスで使い分ければよいような気がしてきたが、そこに気をつかうくらいなら他のこと考えようというきもしてきました:)
Twitter / masaki_fujimoto: @sotarok できっと短いのたくさん連結すると"."が速 ...
全くそのとおりすぎる結果なので完敗した気分.
でも一応まとめておくと
- 連結回数が多ければ , がきいてきてきつい
- 文字列が長ければ . がきいてきてきつい
- 連結1回で文字列短いとかだと大差ない
まあどっちでもいいので個人的には , 使いますが!
そこに気をつかうくらいなら他のこと考えよう
大事なことなので二回言いましたがごもっともでございます.