6

この質問はPHP内のパフォーマンスを中心に設計されていますが、必要に応じて任意の言語に拡張できます。

PHPを長年使用し、文字列を比較する必要があった後、正規表現に対して文字列比較演算子を使用すると、パフォーマンスに関して有益であることがわかりました。

一部の操作は、複雑さまで正規表現を使用して実行する必要があることを完全に理解していますが、正規表現および文字列関数を介して解決できる操作の場合です。

この例を見てください:

PHP

preg_match('/^[a-z]*$/','thisisallalpha');

C#

new Regex("^[a-z]*$").IsMatch('thisisallalpha');

で簡単に行うことができます

PHP

ctype_alpha('thisisallalpha');

C#

VFPToolkit.Strings.IsAlpha('thisisallalpha');

他にも多くの例がありますが、私が言いたいことを理解する必要があります。

どのバージョンの文字列比較を試して、それに傾倒する必要がありますか、またその理由は何ですか?

4

5 に答える 5

6

この質問はここでの私たちの小さな議論から生じたように見えるので、私はどういうわけか答える義務があると感じています。

php開発者は「パフォーマンス」について積極的に洗脳されており、「二重引用符は遅い」などのまったくの愚かなことを含め、多くの噂や神話が生まれています。正規表現が「遅い」ことは、これらの神話の1つですが、残念ながらマニュアルでサポートされています(preg_matchページの悪名高いコメントを参照)。真実は、ほとんどの場合、あなたは気にしないということです。コードを10,000回繰り返さない限り、文字列関数と正規表現の違いに気付くことさえありません。また、コードが10,000回繰り返される場合は、いずれにせよ何か間違ったことをしている必要があります。正規表現を削除するのではなく、ロジックを最適化することでパフォーマンスを向上させることができます。

読みやすさに関しては、正規表現は確かに読みにくいですが、正規表現を使用するコードは、ほとんどの場合、より短く、よりクリーンで、より単純です(上記のリンクであなたと私の答えを比較してください)。

もう1つの重要な懸念事項は、柔軟性です。特にphpでは、文字列ライブラリがそのままユニコードをサポートしていません。具体的な例では、サイトをutf8に移行することにした場合はどうなりますか?ctype_alpha運が悪ければpreg_match、別のパターンが必要になりますが、機能し続けます。

したがって、正規表現は遅くなく、読みやすく、柔軟性があります。いったいなぜ私たちはそれらを避けるべきなのでしょうか?

于 2010-09-20T09:43:06.067 に答える
1

正規表現は、複数のアトミック文字列の比較を置き換えることができる場合、実際にはパフォーマンスの向上につながります(そのようなマイクロ最適化が賢明であるというわけではありません)。したがって、通常、約5つのstrpos()チェックでは、代わりに正規表現を使用することをお勧めします。読みやすさのためにもっと。

そして、これをまとめる別の考えがあります。PCREは、ZendカーネルがIFバイトコードを処理できるよりも速く条件を処理できます。

ただし、すべての正規表現が同じように設計されているわけではありません。複雑さが高くなりすぎると、正規表現の再帰によってパフォーマンス上の利点が失われる可能性があります。したがって、正規表現のマッチングと通常のPHP文字列関数を混在させることはしばしば再考する価値があります。仕事とすべてに適したツール。

于 2010-09-20T10:12:56.017 に答える
1

一致が簡単な場合、PHP自体は正規表現関数よりも文字列関数を使用することをお勧めします。たとえば、preg_matchマニュアルページから:

ある文字列が別の文字列に含まれているかどうかだけを確認したい場合は、preg_match()を使用しないでください。代わりにstrpos()またはstrstr()を使用すると、高速になります。

またはstr_replaceマニュアルページから:

(正規表現のような)凝った置換ルールが必要ない場合は、ereg_replace()またはpreg_replace()の代わりに常にこの関数を使用する必要があります。

しかし、人々は文字列関数を使用して、正規表現によってより適切に解決される問題を解決しようとしていることがわかりました。たとえば、フルワードの文字列マッチャーを作成しようとすると、strpos($string, " $word ")スペースが唯一の描写方法ではないことを考えるのを止めずに、「パフォーマンス」のために(スペースに注意して)使用しようとしている人々に遭遇しました。単語(完全に置き換えるには、文字列関数の呼び出しがいくつ必要になるかを考えてpreg_match('/\bword\b/', $string)ください)。

私の個人的なスタンスは、静的文字列を照合するために文字列関数を使用すること(つまり、一致が常に同じである、文字の異なるシーケンスの一致)と、その他すべての正規表現を使用することです。

于 2010-09-20T13:06:08.200 に答える
0

それらは両方とも理由のために言語の一部です。IsAlphaはより表現力豊かです。たとえば、見ている式が本質的にアルファであるかどうかにかかわらず、ドメインの意味がある場合は、それを使用します。

ただし、たとえば入力検証であり、アンダースコアやダッシュなどを含めるように変更できる場合、または正規表現を必要とする他のロジックを使用している場合は、正規表現を使用します。これは私にとって大部分の時間である傾向があります。

于 2010-09-20T09:23:36.423 に答える
0

PHPの人々は、ある関数のパフォーマンスを別の関数よりも強調しすぎる傾向があることに同意しました。これは、パフォーマンスの違いが存在しないことを意味するわけではありません-確かに存在します-しかし、ほとんどのPHPコード(そして実際にはほとんどのコード)には、文字列比較よりも正規表現を選択するよりもはるかに悪いボトルネックがあります。ボトルネックがどこにあるかを見つけるには、xdebugのプロファイラーを使用します。コードの個々の行を微調整することを心配する前に、発生した問題を修正してください。

于 2010-09-20T13:10:33.043 に答える