2010-11-25 11 views
1

どちらの方が性能が良い:($longstring . $longstring) . $longstring、または$longstring . ($longstring . $longstring)? PHPの連結演算子は左または右結合型ですか?その結合性が最適か、かっこで結合性を上書きすべきですか?PHPのパフォーマンス:付加文字列と付加文字列の比較

+1

このような違いが生じるシナリオは非常に狭く特別なので、一般にインターネットを含む世界中のオーディエンスにはあてはまらない可能性があるため、ローカライズされています。あなたのプロジェクトでこれが問題になる場合は、PHPを使用しないでください。 – Gordon

+0

@Gordon私はマイクロ最適化したいからではなく、PHPが文字列連結をどのように扱うかを知りたいので、この質問をしました。私は「違いを生み出そうとしている」ではない、私は悟りを得ようとしている。 – ppalka

+0

実際にはパフォーマンス上の問題は99 +%には無視できるため、質問からパフォーマンスを尋ねる部分を削除したい場合があります。 – Gordon

答えて

0

$x . $y . $zしかしながら、いずれの方法を介して獲得すべき性能がない($x . $y) . $z

と同じです。それは次のようだ:

// $x . ($y . $ z) 
$tmp = $y . $z; 
return $x . $tmp; 

// ($x . $y) . $ z 
$tmp = $x . $y; 
return $tmp . $z; 

どちらの場合も、連結での同じ量が発生しています。 1つの方法がより高速であった場合(ただしどちらもそうでない場合)は、$x,$yおよび$zの長さに依存します。 (つまり、長い文字列に短い文字列を追加する方が速いか、短い文字列に長い文字列を追加するのが本当に問題なのですか?テストなしでは、その差は重要ではないと思います)。

今、これらは異なっています:$x .= $y$x = $y . $x。 1つは、ASSIGN_CONCAT追加操作です。これは、プレインティング(CONCATASSIGN)よりもかなり高速です。 $x = $x . $yは、機能的には$x .= $yと等価であるが、2つの操作であることに留意されたい。したがって、追加するスタイルには、同じパフォーマンス差(存在する場合)がプリペンドとして設定されます。

+0

ありがとう - 私の考案したベンチマークはあなたの分析を確認します。 – ppalka

+0

私は答えに小さな説明を挿入しました。実際の操作は2つの方法で同じなので、小さな文字列に大きな文字列を追加する方が高速かどうか、またその逆はどうかという疑問が実際に発生します。ベンチマークを行う場合は、その点を考慮する必要があります。私は一般的には、コンセンサスでは、自分自身の好奇心を満たすことを除いて、これが本当に問題ではないということには一般に同意します。 ;) – Matthew

2

本当に重要ではありません。違いは最高でも数ミリ秒です。

あなたのコーディングスタイルと今後のメンテナンス性に最適なスタイルでお書きください。

+0

私が思う '$ longstring'のサイズに依存するかどうかは重要ですか? – ppalka

+1

@ppalka大規模なメガバイトではないと私はほとんど思っていません –

0

Pekkaが言ったように、それは本当に重要ではないし、私はそこに深刻な基準があるとは思わない。あなたはそれを試して、本当に知りたいのかを測るべきです。

連想性については、最も一般的な連結関数が左から右にあると思います。

http://www.php.net/manual/en/language.operators.string.php

0

2は、二つの間には差はなりません。両方とも最初に($ longstring。$ longstring)に2n文字列を追加し、次にその全体に3n文字列を割り当てます。彼らは何か意味を伝えていると思われるので、父親は私を混乱させますが、このケースではもっと早いと思うので、単にそこにいるだけです。どちらのグループにも特別なものがない場合は、$s1 . $s2 . $s3が望ましいです。

パフォーマンス上の理由から、このような細かい詳細はマイクロマニュファクチャリングでは時間の無駄です。 Pekkaが言ったように、それはスピードの信じられないほど小さな違いを与える。パフォーマンスを大幅に向上させる可能性のあるものを探して同じ時間を費やすことができます。

編集:文字列が本当に長く、本当に多く、実際のリクエストを遅くしている場合は、単一の文字列を作成せずに文字列を渡すことを検討する必要があります。それらの配列を保持し、それらを出力するか、または連結せずに格納します。