PHP の strpos()/stripos() または preg_match() 関数のどちらが高速かを知りたいだけです。
質問する
4751 次
3 に答える
6
あなたの質問に関していくつかのテストを実行したこのブログを見つけました。結果は次のとおりです。
- strpos() は preg_match() よりも 3 ~ 16 倍高速です
- stripos() は strpos() よりも 2 ~ 30 倍遅い
- stripos() は、ケースレス修飾子 "//i" を使用した preg_match() よりも 20 ~ 100% 高速です
- preg_match() での正規表現の使用は、長い文字列を使用するよりも高速ではありません
- preg_match() で utf8 修飾子 "//u" を使用すると、2 倍遅くなります
使用されたコードは次のとおりです。
<?php
function loop(){
$str_50 = str_repeat('a', 50).str_repeat('b', 50);
$str_100 = str_repeat('a', 100).str_repeat('b', 100);
$str_500 = str_repeat('a', 250).str_repeat('b', 250);
$str_1k = str_repeat('a', 1024).str_repeat('b', 1024);
$str_10k = str_repeat('a', 10240).str_repeat('b', 1024);
$str_100k = str_repeat('a', 102400).str_repeat('b', 1024);
$str_500k = str_repeat('a', 1024*500).str_repeat('b', 1024);
$str_1m = str_repeat('a', 1024*1024).str_repeat('b', 1024);
$b = 'b';
$b_10 = str_repeat('b', 10);
$b_100 = str_repeat('b', 100);
$b_1k = str_repeat('b', 1024);
echo str_replace(',', "\t", ',strpos,preg,preg U,preg S,preg regex,stripos,preg u,'.
'preg i,preg u i,preg i regex,stripos uc,preg i uc,preg i uc regex').PHP_EOL;
foreach (array($b, $b_10, $b_100, $b_1k) as $needle) {
foreach (array($str_50, $str_100, $str_500, $str_1k, $str_10k,
$str_100k, $str_500k, $str_1m) as $str) {
echo strlen($needle).'/'.strlen($str);
$start = mt();
for ($i=0; $i<25000; $i++) $j = strpos($str, $needle); // strpos
echo "\t".mt($start);
$regex = '!'.$needle.'!';
$start = mt();
for ($i=0; $i<25000; $i++) $j = preg_match($regex, $str); // preg
echo "\t".mt($start);
$regex = '!'.$needle.'!U';
$start = mt();
for ($i=0; $i<25000; $i++) $j = preg_match($regex, $str); // preg Ungreedy
echo "\t".mt($start);
$regex = '!'.$needle.'!S';
$start = mt();
for ($i=0; $i<25000; $i++) $j = preg_match($regex, $str); // preg extra analysiS
echo "\t".mt($start);
$regex = "!b{".strlen($needle)."}!";
$start = mt();
for ($i=0; $i<25000; $i++) $j = preg_match($regex, $str); // preg regex
echo "\t".mt($start);
$start = mt();
for ($i=0; $i<25000; $i++) $j = stripos($str, $needle); // stripos
echo "\t".mt($start);
$regex = '!'.$needle.'!u';
$start = mt();
for ($i=0; $i<25000; $i++) $j = preg_match($regex, $str); // preg utf-8
echo "\t".mt($start);
$regex = '!'.$needle.'!i';
$start = mt();
for ($i=0; $i<25000; $i++) $j = preg_match($regex, $str); // preg i
echo "\t".mt($start);
$regex = '!'.$needle.'!ui';
$start = mt();
for ($i=0; $i<25000; $i++) $j = preg_match($regex, $str); // preg i utf-8
echo "\t".mt($start);
$regex = "!b{".strlen($needle)."}!i";
$start = mt();
for ($i=0; $i<25000; $i++) $j = preg_match($regex, $str); // preg i regex
echo "\t".mt($start);
echo PHP_EOL;
}
echo PHP_EOL;
}
}
function mt($start=null){
if ($start === null) return microtime(true);
return number_format(microtime(true)-$start, 4);
}
loop();
于 2015-10-26T19:35:38.437 に答える
1
preg_match
3 つの中で最も遅いです。大文字と小文字を区別しない一致を処理するために余分な作業を行う必要があるため、stripos
よりも遅くなります。strpos
于 2012-06-09T02:36:51.570 に答える
0
ベンチマークはトリッキーなビジネスですが、またはpreg_match
よりも遅いと言っても過言ではありません。これは、PRCE 関数が文字列関数よりもはるかに強力で柔軟な REGEX エンジンを実装しているためです。strpos
stripos
彼らはまた、さまざまなことをします。strpos
は、別の文字列内の文字列の開始インデックスを示しますが、preg_match
主に文字列の形式を調べたり、正規表現に基づいてそのセクションを取得したりするために使用されます。
つまり、単に別の文字列内の文字列を検索したい場合は、strpos
またはを使用しますstripos
。
于 2012-03-16T08:10:18.503 に答える