Ne hızlıdır: Birçok IFS, yoksa eğer?

12 Cevap php

Ben bir dizi yineleme ve haftanın günlerinde içine değerleri ile bunları ayıklamaya ediyorum.

Bunu yapmak için birçok if ifadeleri kullanıyorum. I else if tabloların bir dizi karşı çok if s, kullanmak eğer işleme hızı için herhangi bir fark yaratır mı?

12 Cevap

Evet, eğer, aşağıdaki kodu düşünün bir başka kullanın:

if(predicateA){
  //do Stuff
}
if(predicateB){
  // do more stuff
}

arasında

if(predicateA){
  //
}
else if(predicateB){
  //
}

predicateA doğruysa ikinci durumda, predicateB (ve herhangi bir başka yüklemler) predicateA doğruysa ilk örnekte, predicateB yine de her zaman değerlendirmeye alınacak ise, (ve böylece tüm kod daha hızlı çalıştırır) değerlendirilmesi gerekmez, predicateA ve predicateB birbirini dışlayan değil ise ve siz de bazı beklenmedik suprises alabilirsiniz.

Ben böyle bir mikro optimizasyonu kod ölçülebilir bir fark yaratacak şüpheliyim.

Sizin sıralama algoritması bir performans probleminin kaynağı olması daha muhtemeldir. Seçtiğiniz sıralama algoritması "else if" karşı kritik, çok değil "IFS" olacak.

GÜNCELLEME:

Hakkında başkaları tarafından yapılan noktalar nedeniyle erken çıkmak ve özel mantık özellikleri daha iyi bir seçim, olmak, tercih edilmesi gerektiğini "eğer" bu durumda. Önermek "else if"

Ama algoritma seçimi konusunda nokta hala duruyor - veri seti çok küçük olmadıkça.

, O (log n) O daha iyi (n ^ 2) olacağı açıktır, ama kümesi konularda büyüklüğü de. Yalnızca birkaç unsurlar varsa, fark olmayabilir. Bu durumda, en kolay anlaşılabilir bir bakışta en iyi bahis olabilir, temiz bir verimsiz bir yöntem kodlama en okunabilir.

Sen phpbench de bir göz atabilirsiniz

Eğer bu seviyede optimize etmek istiyorsanız Ama dürüst olmak gerekirse, php daha başka bir şey öğrenmek isteyebilirsiniz.

alt text

Ben bu performans açısından bunu hangi şekilde önemli olacağını sanmıyorum Dürüst olmak gerekirse, ben herhangi bir fark göremezsiniz şüpheliyim. Ben bir performans enhancment, sadece sözdizimsel güzel olmayan bir switch deyimi kullanarak tavsiye ederim:

switch ($day) 
{
    case "Monday":
        // do something with Monday
        break;
    case "Tuesday":
        // do something with Tuesday
        break;
    case "Wednesday":
        // do something with Wednesday
        break;
}

else if true gideren bir durum vurmak kadar hızlı karşılaştırmak anlamda olmak, ve if s kalanını atlayın.

Ayrıca sıklığı azalan sırasına göre karşılaştırır yeniden düzenleyerek düşünün.

Ve karşılaştırdığınız nesnenin veri türüne bağlı olarak switch deyimini kullanarak.

Duffymo önerdi Ancak bu noktada, size mikro optimize olacaktır. İlk iş için doğru sıralama algoritması seçmedi varsa performans artışı kadar önemli olmayacak.

Ben ardışık arasında gerçek bir fark varsa () varsa bir kriter yaptı ve eğer () sonra birkaç elseif ()

Ben büyük bir dize koymak ve iki yöntem ile yaklaşık 20 strpos () Her zaman (x100 000) yaptım ve bu sonucu gösterdi:

Try 1 : 0.5094 (including elseif)
Try 2 : 0.6700 (including only if)

Hiç şüphe yok. Zaten ortada bir dönüş var olsa bile, () daha hızlı olduğunu sucessive ELSEIF biliyorduk; bu cevap bazı istatistikleri koymak için hala iyi.

Eğer dallanma kodunuzda zaman önemli miktarda alır sizin profilcisine gördük?

Değerler tamsayılar iseniz bir tablo araması kullanarak bir optimizasyon elde edebilir. Örneğin Eğer bir şekilde 7 gün içine haritasına 256 değerlerine sahip demek, 256 hücreler ile bir dizi kurmak olabilir ve her hücre istedim haftanın günü içeriyordu. Daha sonra yerine:


if ( value == 0 ) {
  dayofweek = 1;
} else if ( value == 1 ) {
  dayofweek = 2;
} else if ( value == 2 ) {
  dayofweek = 3;
} else if ...

.. Eğer olabilir ..


dayofweek = lookuparray[value];

Bu tekniği kullanmak Tabii ki, eğer, o zaman ilk değerinin sınırlarını kontrol etmelisiniz.

Genel olarak, "else if" ifs seri, her koşul birbiri ardına kontrol edilir, çünkü tarzı daha hızlı olabilir; bir şartla eşleşen kez bir zincir, kalan atlanır "else if".

Hızlı bir switch deyimi içine optimize edilmiş olur ne bir tablo gönderme olurdu, bunun yeterli durumlarda bir anahtar birkaç olgu varsa, bu sonuçta makine kodu ise-başka bir dizi denetimden çevrilmiş olur (varken .)

Bu karar programın kitlesel akışı içerir beri varsa-tablolar ya da bir if-elseif-elseif birçok kullanmak için karar ..., performans güvenmemelisiniz.

Ben işlevselliğini kaybetmeden eğer-elseif büyük bir eğer-ifadeler birçok geçiş yapabilirsiniz şüpheliyim.

Onun bir tasarım soru, bir perfomansı değil.

Ben bunun yerine bir geçiş için () deyimi tercih için başka bir oy vereceğini.

if blok böylece yöntemini bitirme döndürür Bu soru özellikle ilginç. Ayrıca Java çalışmalarında şekilde karşılaştırıcıya doğrudan uygulanır.

Ben böylece her yöntemi (feryat) 250.000.000 kez çalıştırmak ve şöyle sonuçlar:

two values   if/else    - 6.43 millis
three values if/else/if - 8.66 millis
three values if/if      - 9.01 millis

Kötü durumda iyi bir do notice that this is the aggregate sum yineleme Bu yöntemlerin her biri 250 milyon kez daha 1,4 kat daha uzun sürer iken. Bu gecikme algıladıkları bir insan için 100ms almak ve kötü / iyi fark farklı yöntemleri arasındaki farkı idrak neredeyse bir trilyon (1000 * 1000 milyon) yineleme ihtiyacı olacağını ima eder 2.58 millis olduğunu varsayarak.

Summing it up: if-else bunu en hızlı seçenek de daha okunaklı ve daha az hata eğilimli olan biridir durumlarda biri kullanın.

// methods used to measure difference between if and if/else

/** equality is not important **/
private static int comparatorOfIfElse(int a, int b) {
    if(a < b) return -1;
    else return  1;
}

/** equality is taken into account using if/else **/
private static int comparatorOfIfElseIf(int a, int b) {
    if(a < b) return -1;
    else if(a > b) return  1;
    return 0;
}

/** equality is taken into account using only if **/
private static int comparatorOfIf(int a, int b) {
    if(a < b) return -1;
    if(a > b) return  1;
    return 0;
}