パフォーマンスに関して、次のことの間に違いはありますか:
$message = "The request $request has $n errors";
と
$message = sprintf('The request %s has %d errors', $request, $n);
PHPで?
関数を呼び出すにはもっと多くのことが必要だと思いますが、変数名を展開するために裏で PHP が何をしているのかはわかりません。
ありがとう!
パフォーマンスに関して、次のことの間に違いはありますか:
$message = "The request $request has $n errors";
と
$message = sprintf('The request %s has %d errors', $request, $n);
PHPで?
関数を呼び出すにはもっと多くのことが必要だと思いますが、変数名を展開するために裏で PHP が何をしているのかはわかりません。
ありがとう!
それはどうでもいい事です。
パフォーマンスの向上は非常に小さいため、10000 秒または 100000 秒の反復でのみ (数百秒の改善として) 表示されます。
具体的な数値については、このベンチマークを参照してください。数百ミリ秒の測定可能な差を達成するには、100,000 回の関数呼び出しを使用して 1MB 以上のデータを生成する必要があることがわかります。ほとんど現実の状況ではありません。最も遅いメソッド (「sprintf() with positional params」) でさえ、最速の 0.00282 ミリ秒に対してわずか 0.00456 ミリ秒しかかかりません。100,000 回の文字列出力呼び出しを必要とする操作の場合、これを最適化することで節約できる可能性がある 100 ミリ秒よりも桁違いに遅くなる他の要因 (ネットワーク トラフィックなど) があります。
あなたや他の人にとってコードが最も読みやすく、保守しやすいものを使用してください。個人的には、このsprintf()
方法は素晴らしいアイデアです。自分で使い始めることを考えなければなりません。
すべての場合において、二重引用符で囲まれた文字列を指定しているため、変数についても解析する必要があるため、2 番目の方が速くはなりません。マイクロ最適化を行う場合、適切な方法は次のとおりです。
$message = sprintf('The request %s has %d errors', $request, $n);
それでも、関数呼び出し、文字列の解析、値の変換などのオーバーヘッドのため、秒は遅いと思います(@Pekkaが指摘したように、実際には違いは問題ではありません)。ただし、2行のコードはそうではないことに注意してください。 2 番目のケースでは $n が整数に変換されるため、同等です。$n が「エラーなし」の場合、最初の行は次のように出力されます。
The request $request has no error errors
2番目のものは出力しますが:
The request $request has 0 errors
ここでは、「変数拡張とsprintf」に関するパフォーマンス分析を行いました。
@pekkaが言うように、「あなたのコードをあなたや他の人にとって最も読みやすく、保守しやすくします」。パフォーマンスの向上が「低い」(〜2回未満)場合は、無視してください。
ベンチマークの要約:PHPは、二重引用符とヒアドキュメントの解像度に最適化されています。平均時間を尊重する割合、のみを使用して非常に長い文字列を計算する割合、
sprintfのみが何らかのフォーマットタスクを実行し(ベンチマークの「%s%s%d%s%f%s」を参照)、@ Darhazerが示すように、出力に多少の違いがあることに注意してください。より良いテストは、2つのベンチマークです。1つは連結時間('%s'フォーマッター)のみを比較し、もう1つはフォーマットプロセスを含みます。たとえば、'%3d%2.2f'と、変数を二重引用符に展開する前の同等の機能です。短いテンプレート文字列を使用したベンチマークの組み合わせ。
の主な利点sprintf
は、ベンチマークで示されているように、非常に低コストのフォーマッタ(!)です。一般的なテンプレートについては、 vsprintf関数の使用をお勧めします。
二重引用符(およびヒアドキュメント)の主な利点は、パフォーマンスです。sprintfの位置マークと比較すると、パラメーターの数(1以降)とともに増加する、名目上のプレースホルダーの読みやすさと保守性。
インデックス付きプレースホルダーの使用は、sprintfによる保守性の中間にあります。
注:本当に必要な場合にのみ、一重引用符の連結を使用しないでください。PHPは、のような安全な構文と、のような"Hello {$user}_my_brother!"
参照を有効にすることを忘れないでください"Hello {$this->name}!"
。
複数の文字列変数を文字列に注入する場合、最初の変数の方が高速です。
$message = "The request $request has $n errors";
また、1 回の注入では、ドット (.) 連結の方が高速になります。
$message = 'The request '.$request.' has 0 errors';
10 億回のループで反復を行い、違いを見つけます。
例:
<?php
$request = "XYZ";
$n = "0";
$mtime = microtime(true);
for ($i = 0; $i < 1000000; $i++) {
$message = "The request {$request} has {$n} errors";
}
$ctime = microtime(true);
echo ($ctime-$mtime);
?>
最終的に、さまざまなベンチマークを見ることで確認できる単一の変数割り当てのコンテキストを考慮すると、1 番目が最速です。おそらく、コア PHP 関数の sprintf フレーバーを使用すると、より拡張可能なコードが可能になり、opcache や apc などのバイトコード レベルのキャッシュ メカニズムに対してより最適化される可能性があります。つまり、特定のサイズのアプリケーションでは、sprintf メソッドを使用するときに使用するコードを減らすことができます。RAM にキャッシュする必要があるコードが少ないほど、他のことやより多くのスクリプトに使用できる RAM が増えます。ただし、これは、スクリプトが評価を使用して RAM に適切に収まらない場合にのみ問題になります。