if deyimi koşul optimizasyon

10 Cevap php

(OR operatörü ile ayrılmış) iki koşullar, koşullardan biri ile statment durumların +70% kapsar ve ben sadece istediğiniz hızı çıkarları kadar, ikinci durum daha yürütmek / işlemek için çok daha az zaman alır eğer bir var İlk koşul yanlış değerlendirilirse ikinci koşul işlenecek.

Bu koşul yerine ve gerçek değerlendirir olduğu durumlarda ikinci durum bile işlenir - ilk koşul (hızlı bir) statment ilk eğer görünür böylece i koşulları sipariş?

if ( (condition1) | (condition2) ){
  // do this
}

İlk yanlış değerlendirilirse sadece ifadeler ikinci durumunu kontrol ya da ben yuva iki gerekir?

if (condition1){
  // do this
}else if (condition2){
  // do this
}

Ben php çalışıyorum, ancak ben bu dil agnostik olabileceğini varsayar.

10 Cevap

Başka kısa sürede yeterince bilinen bir şey değerlendirilir, böylece C, C + +, C #, Java ve diğer. NET dilleri için boolean ifadeler optimize edilmiştir.

Karartılmış kodu yapmak için eski bir numara gibi eğer ifadeleri oluşturmak için bu kullanmak için oldu:

a || b();

"bir" doğru ise, "b ()" değerlendirilecektir asla, bu yüzden onu içine yazabilirsiniz:

if(!a)
    b();

ve benzer şekilde:

a && b();

olacak

if(a)
    b();

Please note Bu sadece geçerli olduğunu | | ve && operatör. İki operatörleri | ve & sırasıyla bitsel veya, ve ve ve bu nedenle "optimize" değildir.

EDIT: As mentioned by others, trying to optimise code using short circuit logic is very rarely well spent time.

Önce okumak ve anlamak daha kolay çünkü hem netlik için gidin. Eğer terimlerin basit bir yeniden düzenlenme çok zeki olmaya çalışırsanız Ayrıca, herhangi belirgin bir neden olmadan çılgınca farklı davranışlara yol açabilir.

İkincisi, optimizasyonu için gitmek, ama sadece zamanlama ve profilleme sonra. Way çok geliştirici profil olmadan erken optimizasyon yapmak. Çoğu zaman tamamen yararsız bulunuyor.

Hemen hemen her dil bir kısa devre değerlendirme yapar. Kendisine aboslutely gerekli ise ikinci koşulu anlamı yalnızca değerlendirilir. | Değil, tek tek, | | Bunun işe yaraması için, çoğu dil çift boru kullanın.

Bkz http://en.wikipedia.org/wiki/Short-circuit_evaluation

In C, C++ and Java, the statement:

if (condition1 | condition2) {
  ...
}

hem koşulları her zaman değerlendirmek ve tüm ifade doğruysa tek gerçek olacaktır.

Deyimi:


if (condition1 || condition2) {
  ...
}

condition1 false sadece condition2 değerlendirecektir. Condition2 bir yan etkisi ile bir fonksiyon ya da başka bir ifade ise anlamlı bir fark vardır.

Bununla birlikte, || halinde ve if / else durum arasında bir fark vardır.

Son zamanlarda sorulara bu tür bir sürü gördüm - hadde optimizasyonu.

Ben bazı durumlarda mantıklı düşünüyorum:

  1. Bilişim durum 2 sabit bir zaman bir işlem değildir
  2. Sen eğitim amaçlı kesinlikle soruyorsun - Eğer dil çalışmaları, 3us kurtarmak için değil bilmek istiyorum.

Diğer durumlarda, yineleme ya da bir koşullu kontrol etmek için "hızlı" bir şekilde endişesi aptalca. Bunun yerine herhangi bir kayıt (ama önemsiz) bir fark görmek için çalışmaların milyonlarca gerektiren yazma testleri, netlik odaklanmak.

Bir başkası (siz olabilirsiniz!) Ne zaman bir ay içinde bu kodu alır veya bir yıl, ne en önemli olacak netlik olduğunu.

Bu durumda, ilk örnek, kısa net ve kendinizi tekrar etmenizi gerektirmez.

Kısa devre optimizasyonu için değildir. Bu ana amacı işe yaramaz kod çağıran önlemek, henüz okunabilir testinde neden olduğunu bulunuyor. Örnek:

if (i < array.size() && array[i]==foo) ...

Bu dizi [i] çok iyi i aralığının dışında ise bir erişim ihlali almak ve programı çökebilir unutmayın. Böylece bu program kesinlikle değerlendirmesini kısa devre bağlıdır!

Bu çok daha sık optimizasyon kaygıları daha ifadeler bu şekilde yazma nedeni olduğuna inanıyorum.

Optimizasyonu amaçları için kısa devreyi kullanarak genellikle overkill olsa da, kullanmak için başka zorlayıcı nedenler kesinlikle vardır. Bu tür bir örnek, (C + + olarak) şu şekildedir:

if( pObj != NULL && *pObj == "username" ) {
    // Do something...
}

Burada, kısa devre olduğunu pObj önce çözümleyecek tahsis edilmiştir sağlamak için güvenerek ediliyor. Bu çok daha özlü if ifadeleri iç içe olan daha hızlıdır.

Bu en azından, ilk seçenek yeterlidir Perl için içeri melodi edeceğiz dil agnostik etiketli beri, ben PHP ile aşina değilim. Bu sağa sola değerlendirir ve en kısa sürede koşul yerine olarak düşer.

Iyi optimizasyonu ile çoğu dilde eski sadece iyi çalışır.

| PHP bir bit operatörüdür. Bu tam olarak, $a OR $b anlamına gelmez. Sen çift boru kullanmak isteyeceksiniz. Ve evet, belirtildiği gibi, PHP kısa devre değerlendirme yapar. Bir && fıkrasının birinci koşul yanlış değerlendirilirse benzer şekilde, PHP ya, fıkra kalanını değerlendirmek değil.

VB.net "OrElse" ve "AndAlso" olarak adlandırılan iki harika ifadesi var

OrElse kısa devre kendisi bir gerçek değerlendirme ulaşır ve arzu kod çalıştırmasına ilk kez olacak.

If FirstName = "Luke" OrElse FirstName = "Darth" Then
   Console.Writeline "Greetings Exalted One!"
End If

AndAlso irade kısa devre kendisi Yanlış değerlendirme ilk kez değil, blok içinde kodu değerlendirmek.

If FirstName = "Luke" AndAlso LastName = "Skywalker" Then
   Console.Writeline "You are the one and only."
End If

Ben bu yararlı hem bulabilirsiniz.