SQLクエリが発行されるたびに次のチェックを実行する汎用DBクエリ関数があります。
if (preg_match('~^(?:UPDATE|DELETE)~i', $query) === 1)
if (preg_match('~^(?:UPDATE|DELETE)~iS', $query) === 1)
if ((stripos($query, 'UPDATE') === 0) || (stripos($query, 'DELETE') === 0))
strpos()
単純な呼び出しは、を実行するよりもはるかに高速であることを私は知っていますが、 2回preg_match()
呼び出しているので、どちらがより良いパフォーマンスを発揮するかは本当にわかりません。strIpos()
2番目のオプションのS
パターン修飾子も、マニュアルから、私の頭にいくつかの混乱をもたらします。
パターンを複数回使用する場合は、マッチングにかかる時間を短縮するために、パターンの分析に時間をかける価値があります。この修飾子が設定されている場合、この追加の分析が実行されます。現在、パターンの調査は、開始文字が1つ固定されていないアンカーされていないパターンにのみ役立ちます。
この場合、速度は重要ではありませんが(そうでない場合は、この汎用クエリ関数を使用しません)、単純さを維持しながら、可能な限り高速に実行したいと思います。
上記のオプションのどれを選択する必要がありますか?
編集:私は単純なベンチマークを実行しましたが、それでもどちらの方法がより効果的かを判断できません。
10,000回の試行の結果は次のとおりです(合計所要時間、秒単位)。
Array
(
[match] => Array
(
[stripos] => 0.0965
[preg_match] => 0.2445
[preg_match?] => 0.1227
[preg_match?S] => 0.0863
)
[no-match] => Array
(
[stripos] => 0.1165
[preg_match] => 0.0812
[preg_match?] => 0.0809
[preg_match?S] => 0.0829
)
)
100,000回の試行:
Array
(
[match] => Array
(
[stripos] => 1.2049
[preg_match] => 1.5079
[preg_match?] => 1.5564
[preg_match?S] => 1.5857
)
[no-match] => Array
(
[stripos] => 1.4833
[preg_match] => 0.8853
[preg_match?] => 0.8645
[preg_match?S] => 0.8986
)
)
1,000,000回の試行:
Array
(
[match] => Array
(
[stripos] => 9.4555
[preg_match] => 8.7634
[preg_match?] => 9.0834
[preg_match?S] => 9.1629
)
[no-match] => Array
(
[stripos] => 13.4344
[preg_match] => 9.6041
[preg_match?] => 10.5849
[preg_match?S] => 8.8814
)
)
10,000,000回の試行:
Array
(
[match] => Array
(
[stripos] => 86.3218
[preg_match] => 93.6755
[preg_match?] => 92.0910
[preg_match?S] => 105.4128
)
[no-match] => Array
(
[stripos] => 150.9792
[preg_match] => 111.2088
[preg_match?] => 100.7903
[preg_match?S] => 88.1984
)
)
結果は大きく異なることがわかるように、これがベンチマークを実行する正しい方法であるかどうか疑問に思います。