Hangi hızlıdır: in_array () veya PHP ifadelerin bir demet?

5 Cevap php

Daha hızlı şunları yapmaktır:

 if ($var != 'test1' && $var != 'test2' && $var != 'test3' && $var != 'test4') { ... }

Veya:

 if (!in_array($var, array('test1', 'test2', 'test3', 'test4') { ... }

, Bir veya diğer yapmak için daha hızlı hangi noktada değerlerin bir dizi var mı?

(Bu durumda, ikinci seçenek kullanılan dizi alreay yoktur.)

5 Cevap

Ben kuvvetle sadece in_array(), herhangi bir hız farkı önemsiz olacaktır kullanmanızı öneririz ediyorum, ama ayrı ayrı değişken test okunabilirliği korkunç.

sadece eğlence için burada ben koştu bir test:

$array = array('test1', 'test2', 'test3', 'test4');
$var = 'test';
$iterations = 1000000;

$start = microtime(true);
for($i = 0; $i < $iterations; ++$i) {
    if ($var != 'test1' && $var != 'test2' && $var != 'test3' && $var != 'test4') {}
}
$end = microtime(true);

print "Time1: ". ($end - $start)."<br />";

$start2 = microtime(true);
for($i = 0; $i < $iterations; ++$i) {
    if (!in_array($var, $array) ) {}
}
$end2 = microtime(true);

print "Time2: ".($end2 - $start2)."<br />";

// Time1: 1.12536692619
// Time2: 1.57462596893

$var ayarlı değilse izlemek için biraz önemsiz not, yöntem 1 (kaç koşulları size testi bağlı olarak) daha uzun sürer

Eğer !== tabloların bir demet yerine arıyorsanız, size öğeleri tür denetimi zorlar ki, in_array as true için üçüncü parametre geçmesi gerektiğini unutmayın Dizide.

Olağan != Açıkçası, bu gerektirmez.

İlk hızlı olacak - ikinci yükü bir sürü vardır: dizi arama, bir işlevi çağırırken, bir dizi oluşturma ...

Ben cevap aşağı bir çift bir soru Ancak, dediğim gibi, erken optimizasyon tüm kötülüklerin köküdür. Daha sonra duruma, sonra da if bunu profil optimize edilmesi gerekmektedir, okunabilir olması için kod yazmak gerekir.

Edit:

@ Owen'ın kodu (PHP 5.2.6 / pencereler) ile benim zamanlamaları:

Time1: 1.33601498604
Time2: 4.9349629879

Söz gibi, döngü içinde array (...) taşıma:

Time1: 1.34736609459
Time2: 6.29464697838

in_array'in öğeleri büyük sayılar için daha hızlı olacaktır. "Büyük" veri ve bilgisayarınıza bağlı bir çok faktör dayalı çok öznel olmak. Soruyorsun, ben öğelerin önemsiz bir dizi ile ilgili değil varsayalım. Uzun listelerde için, ters çevrilmiş bir dizi heed this information, ve ölçü performans o php böylece yerine doğrusal arama karma aramalarını yararlanabilirler. Çimdik "statik" dizisi performansını artırmak değil, ama aynı zamanda olabilir için.

Daha tutarlı sonuçlar için bir saygısız dizi ve daha yineleme ile, Owen'ın testi kodu kullanarak:

$array2 = array_flip($array);
$iterations = 10000000;

$start = microtime(true);
for($i = 0; $i < $iterations; ++$i) {
    if (!isset($array2[$var])) {}
}
$end = microtime(true);
print "Time3: ".($end - $start)."<br />";

Time1: 12.875
Time2: 13.7037701607
Time3: 3.70514011383

RoBorg belirttiği gibi, bu yineleme döngü içinde hareket ettirilmelidir nedenle dizi oluştururken yükü var unutmayın. Bu nedenle, Sparr sonrası array_flip fonksiyonu ile havai olarak orada da biraz yanıltıcı.

İşte Tüm 5 varyasyonları ile bir başka örnek:

$array = array('test1', 'test2', 'test3', 'test4');
$var = 'test';
$iterations = 1000000;

$start = microtime(true);
for($i = 0; $i < $iterations; ++$i) {
   if ($var != 'test1' && $var != 'test2' && $var != 'test3' && $var != 'test4') {}
}
print "Time1: ". (microtime(true) - $start);

$start = microtime(true);
for($i = 0; $i < $iterations; ++$i) {
   if (!in_array($var, $array) ) {}
}
print "Time2: ".(microtime(true) - $start);

$start = microtime(true);
for($i = 0; $i < $iterations; ++$i) {
   if (!in_array($var, array('test1', 'test2', 'test3', 'test4')) ) {}
}
print "Time2a: ".(microtime(true) - $start);

$array2 = array_flip($array);
$start = microtime(true);
for($i = 0; $i < $iterations; ++$i) {
  if (!isset($array2[$var])) {}
}
print "Time3: ".(microtime(true) - $start);

$start = microtime(true);
for($i = 0; $i < $iterations; ++$i) {
    $array2 = array_flip($array);
  if (!isset($array2[$var])) {}
}
print "Time3a: ".(microtime(true) - $start);

Benim sonuçlar:

Time1 : 0.59490108493 // straight comparison
Time2 : 0.83790588378 // array() outside loop - not accurate
Time2a: 2.16737604141 // array() inside loop
Time3 : 0.16908097267 // array_flip outside loop - not accurate
Time3a: 1.57209014893 // array_flip inside loop

Özetle, (isset ile) array_flip kullanarak inarray daha hızlı ama hızlı düz bir karşılaştırma gibidir.