2012-08-08 14 views
5

Zastanawiam się. Czy istnieje lepsza wydajność z tym:Czy używanie macierzy jest szybsze niż wykonywanie wielu instrukcji?

$value = preg_replace(array('/_{1,}/', '/-{2,}/'), array('_', '-'), $value); 

niż to:

$value = preg_replace('/_{1,}/', '_', $value); 
$value = preg_replace('/-{2,}/', '-', $value); 

To jest po prostu bardzo prosty przykład.

+7

Dwa słowa: profil go. – deceze

+1

'$ start = microtime (true); // Twój kod; echo microtime (true) - $ start; '. Powtórz kilka razy i zobacz wynik. – Leri

+0

Jestem na tym. Daj mi minutę. :) – insertusernamehere

Odpowiedz

3

Jak mój kodu testu:

$value = 'dfkjgnnfdjgnjnfdkgn dnf gnjknkxvjn jkngjsrgn'; 
$value1 = 'dfkjgnnfdjgnjnfdkgn dnf gnjknkxvjn jkngjsrgn'; 

$start = microtime(true); 
for ($i = 0; $i < 1000000; $i++) 
$value = preg_replace(array('/_{1,}/', '/-{2,}/'), array('_', '-'), $value); 
echo microtime(true) - $start.'<br>'; 

$start1 = microtime(true); 
for ($i = 0; $i < 1000000; $i++){ 
    $value1 = preg_replace('/_{1,}/', '_', $value1); 
    $value1 = preg_replace('/-{2,}/', '-', $value1); 
} 
echo microtime(true) - $start1; 

1,4254899024963

1,2811040878296

+0

Wielkie dzięki za twój wysiłek. – insertusernamehere

+2

@insertusernametutaj Nie ma za co. Tak przy okazji, bardzo mi pomogłeś. Zoptymalizowałem małą część mojego projektu, która dała mi prawie pół sekundy różnicy, która jest naprawdę cenna w obecnej sytuacji. Dziękuję też. – Leri

+1

Ładne Zbieg okoliczności. :) – insertusernamehere

2

Używanie microtime() Metoda testowania że PLB wspomniano w komentarzach, szukasz na około 0,3 sekundy różnicy w wydajności. Drugi przykład jest "szybszy".

+0

Na podstawie czego? Próbowałem wykonać test, a drugi jest szybszy. –

+0

Edytowałem swoją odpowiedź, aby poprawić błąd logiczny w moim teście. Używa funkcji mikrotime w celu odtworzenia czasów wykonania. Drugi jest szybszy o około 3 sekundy. –

+0

Hmm ok, nie ma za co ;-) –

1

Aby śledzić powołanie stworzyłem bardzo krótki przykład, w którym wymiana ma coś do zrobienia:

$value = '1_2__3___4____5_____6______1-2--3---4----5-----6------'; 

$s_1 = microtime(true); 
    for ($i = 0; $i < 1000000; ++$i) { 
     $r_1 = preg_replace(array('/_{2,}/', '/-{2,}/'), array('_', '-'), $value); 
    } 
$e_1 = microtime(true); 

$s_2 = microtime(true); 
    for ($i = 0; $i < 1000000; ++$i) { 
     $r_2 = preg_replace('/_{2,}/', '_', $value); 
     $r_2 = preg_replace('/-{2,}/', '-', $r_2); 
    } 
$e_2 = microtime(true); 

print $r_1; 
print $r_2; 
print $e_1 - $s_1; 
print $e_2 - $s_2; 

z tego wyniku:

3,69554805756

3,2879319191

Zgodnie z oczekiwaniami, nie ma znaczącej różnicy - właściwie nie ma różnicy - rozmawiamy o milionie połączeń. Ciekawe jest również to, że druga wersja jest "nieco" szybsza. Myślę, że to dlatego, że tworzenie i uruchamianie tych tablic.

+0

Jeśli twój wzorzec jest bardziej złożony niż w tym przykładzie, spójrz na 'S' (badanie) [modyfikator] (http://www.php.net/manual/en/reference.pcre.pattern.modifiers.php) –

+0

To brzmi interesująco w przypadku złożonych problemów. Dzięki za tę wskazówkę. – insertusernamehere

0

Warto zauważyć, że uruchomiłem dwa skrypty iw moim przypadku te z tablicami były szybsze.

pierwszy test

2,0891699790955

2,2491400241852


Drugi test

3,2192239761353

3,4498269557953


systemu

PHP: 5.4.9

OS: Ubuntu x64

CPU: i7-3630QM

Powiązane problemy