56

(php5を想定)考慮

<?php

    $foo = 'some words';

    //case 1
    print "these are $foo";

    //case 2
    print "these are {$foo}";

    //case 3
    print 'these are ' . $foo;
?>

1と2の違いってそんなにあるの?

そうでない場合、1/2 から 3 の間はどうでしょうか。

4

15 に答える 15

108

パフォーマンスの違いは、少なくとも 2012 年 1 月以降は無関係であり、それよりも前の可能性があります。

Single quotes: 0.061846971511841 seconds
Double quotes: 0.061599016189575 seconds

以前のバージョンの PHP には違いがあった可能性があります。個人的には二重引用符よりも単一引用符の方が好きなので、便利な違いでした。記事の結論は、次の優れた点を示しています。

自分で偽造していない統計を決して信用しないでください。

(記事はこのフレーズを引用していますが、元のクイップはウィンストン・チャーチルに誤って起因した可能性が高く、ヨーゼフ・ゲッベルスの宣伝省によってチャーチルを嘘つきとして描写するために発明されました。

Ich traue keiner Statistik, die ich nicht selbst gefälscht habe.

これは大まかに「私は自分自身を偽造していないという統計を信用していない」と言い換えることができます。)

于 2009-01-27T02:53:53.920 に答える
47

まあ、すべての「実生活でより速いかもしれないもの」の質問と同様に、実生活のテストに勝るものはありません.

function timeFunc($function, $runs)
{
  $times = array();

  for ($i = 0; $i < $runs; $i++)
  {
    $time = microtime();
    call_user_func($function);
    $times[$i] = microtime() - $time;
  }

  return array_sum($times) / $runs;
}

function Method1()
{ 
  $foo = 'some words';
  for ($i = 0; $i < 10000; $i++)
    $t = "these are $foo";
}

function Method2()
{
  $foo = 'some words';
  for ($i = 0; $i < 10000; $i++)
    $t = "these are {$foo}";
}

function Method3()
 {
  $foo = 'some words';
  for ($i = 0; $i < 10000; $i++)
    $t = "these are " . $foo;
}

print timeFunc('Method1', 10) . "\n";
print timeFunc('Method2', 10) . "\n";
print timeFunc('Method3', 10) . "\n";

すべてをページインするために数回実行してから...

0.0035568

0.0035388

0.0025394

したがって、予想どおり、補間は実質的に同一です (おそらく、補間エンジンが処理する必要がある余分な文字が原因で、ノイズ レベルの違いが生じます)。まっすぐに連結すると、速度の約 66% になりますが、これは大きなショックではありません。補間パーサーは検索を行い、行うべきことを何も見つけずに、単純な内部文字列連結で終了します。concat が高コストだったとしても、変数を解析して元の文字列をトリミング/コピーするすべての作業の、インターポレーターはそれを行う必要があります。

Somnath による更新:

上記のリアルタイムロジックに Method4() を追加しました。

function Method4()
 {
  $foo = 'some words';
  for ($i = 0; $i < 10000; $i++)
    $t = 'these are ' . $foo;
}

print timeFunc('Method4', 10) . "\n";

Results were:

0.0014739
0.0015574
0.0011955
0.001169

文字列のみを宣言していて、その文字列も解析する必要がない場合、なぜ PHP デバッガーを混乱させて解析する必要があるのでしょうか。あなたが私の主張を理解してくれることを願っています。

于 2008-08-17T15:10:24.843 に答える
24

ライブ ベンチマーク:

http://phpbench.com/

変数を一重引用符と二重引用符で連結すると、実際には微妙な違いがあります。

于 2009-01-27T04:08:03.113 に答える
18

@Adamのテストを使用

"these are " . $foo

以下はさらに高速であることに注意してください。

'these are ' . $foo;

これは、二重引用符で囲まれた「文字列」が評価され、一重引用符で囲まれた「文字列」がそのまま取得されるという事実によるものです...

于 2008-08-17T15:44:57.443 に答える
12

PHPで文字列操作を最適化しようとすることにあまり夢中にならないでください。データベースクエリの記述が不十分な場合、またはキャッシュスキームを使用していない場合、連結と補間は(実際のパフォーマンスでは)意味がありません。後でコードをデバッグしやすく、パフォーマンスの違いが無視できるように文字列操作を記述します。

@uberfuzzyこれが言語の細目についての質問であると仮定すると、それは問題ないと思います。貧弱なデータベースクエリなどの実際のパフォーマンスシンクと比較した場合、実際のアプリケーションでのシングルクォート、ダブルクォート、ヒアドキュメントのパフォーマンスを無意味に比較するという会話に追加しようとしています。

于 2008-08-19T13:12:17.407 に答える
9

実行時間の違いはまったく無視できます。

参照してください

  • NikiC のブログ: PHP で補間と連結がどのように機能するか、およびそれらの速度を気にすることがまったく無意味である理由についての技術的な説明については、単一引用符のパフォーマンスに関する神話の反証を参照してください。

このようなマイクロ最適化に時間を無駄にしないでください。プロファイラーを使用して、実際のシナリオでアプリケーションのパフォーマンスを測定し、実際に必要な場所を最適化します。1 つのずさんな DB クエリを最適化すると、コード全体にマイクロ最適化を適用するよりもパフォーマンスが大幅に向上する可能性があります。

于 2012-06-19T18:27:54.517 に答える
3

フォーラム ソフトウェアの開発者である Vanilla が、コード内のすべての二重引用符を単一引用符に置き換えたことを覚えているようで、かなりの量のパフォーマンスの向上に気付きました。

ただし、現時点では、ディスカッションへのリンクを追跡できないようです。

于 2009-01-27T03:22:48.493 に答える
1

二重引用符は、はるかに遅くなる可能性があります。これを行う方が良いといくつかの場所から読みました

'parse me '.$i.' times'

よりも

"parse me $i times"

2番目のコードの方が読みやすいコードだと思いますが。

于 2009-01-27T04:36:01.700 に答える