肉とビールとパンケーキ by @sotarok

少し大人になった「肉とご飯と甘いもの」

echo は , か . かって話

ふとしたことから, echo は , で連結(, の場合連結ではないんですけど)か,. で連結かって話がでて白熱したんですが.
要するに,

<?php
$hoge = 'hoge';
echo $hoge, PHP_EOL;
echo $hoge . PHP_EOL;

どっちだ,って話です.

突き詰めていくと,議論は

  • 好み
  • どっちだっていい
  • プロジェクトのコーディング規約にあわせろ
  • 慣れ
  • どうでもいい

あたりに落ち着くんですが(落ち着いていない).つまり,vim/emacs, タブ/スペース,きのこ/たけのこ にならぶ,プログラマー宗教論争のようなものですね.

まあ個人的な主張としては,

  • echo は言語構造で,「出力」が目的なら出力対象を列挙すべき
    • . での連結は,「一度連結された文字列を生成し,それを出力する」わけなので
    • PHP だと 「.」と「,」だから見た目的に大差ないじゃん!って思うけど,Python で「print hoge, fuga」と「print hoge + fuga」だとだいぶ違うように見えるよね?
  • , は使ってる人があんまいない(なぜなら僕も入門書で . を使っていたで覚えて以来ずっと . だったし).だから,マイノリティはカッコイイから , がいい(←
  • きっと文字列連結で余計なメモリアロケートが発生しないから速いんじゃないか

あたりでした.

検証

ま,どうでもいいんですが,速度の面は気になったので以下検証.

<?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回で文字列短いとかだと大差ない


まあどっちでもいいので個人的には , 使いますが!

そこに気をつかうくらいなら他のこと考えよう

大事なことなので二回言いましたがごもっともでございます.