PHP'de === neden == daha hızlı?


168

Neden PHP'den ===daha hızlı ==?


40
Daha hızlı, ama önemli ölçüde daha hızlı mı?
Piskvor

19
Lütfen php içinde daha hızlı olanı okumayın. JOIN'leri kötüye kullanmadan tek bir SQL sorgusunda ilginç verileri nasıl alacağınız hakkında bilgi edinin.
Kamil Szot

15
Kime aynı konu ile ilgilenebilir === vs ==, ancak JAVASCRIPT'de okuyabilir: stackoverflow.com/questions/359494/…
Marco Demaio

5
@Piskvor, soru bu değil
Pacerier

6
@Pacerier: Adil nokta - bu yüzden sadece bu konuda yorum yaptım. Bu soruya cevap vermez, fakat ona bakış açısı sağlar.
Piskvor binadan ayrıldı

Yanıtlar:


200

Eşitlik operatörü ==, diğer işlenene eşit olup olmadığını görmek için veri türünü geçici olarak zorlar veya dönüştürür, oysa ===(kimlik operatörü) herhangi bir dönüştürme yapmak zorunda kalmaz ve böylece daha az çalışma yapılır, bu da daha hızlı hale getirir.


Bence görüşünüz PHP Manual'ın söylediklerine aykırı. $ A == $ b, $ a $ b'ye eşitse DOĞRU, $ a === $ b ise $ a $ b'ye eşitse DOĞRU ve aynı türdeyse derler.
Haziran'da Bakhtiyor

92
Öyleyse nasıl tersi olur?
meder omuraliev

2
Aslında 2 işlenenin karmaşık türler için aynı bellek alanına işaret ettiğine inanıyorum, ancak meder'in cevabı bunu kapsıyor
Temel

1
(JS'de olduğu gibi) mantıklıdır, ancak birisinin bazı basit basit performans testlerine de bir referans eklemesi iyi olur.
Marco Demaio

4
phpbench.com , "Kontrol Yapıları" bölümünde == ve === arasındaki performans farkının bir göstergesine sahiptir.
ekillaby

54

===dakikayı gerçekleştirmez, bu nedenle 0 == '0'değerlendirir true, ancak 0 === '0'- değerine false.


25

İlk olarak, === iki argümanın aynı tipte olup olmadığını kontrol eder - böylece herhangi bir karşılaştırma yapılmadan önce 1 sayısı ve '1' dizesi tür kontrolünde başarısız olur. Öte yandan, == önce türü denetlemez ve devam eder ve her iki bağımsız değişkeni aynı türe dönüştürür ve sonra karşılaştırmayı yapar.

Bu nedenle, === başarısızlık durumunu denetleme konusunda daha hızlı


8
Ben ==de herhangi bir tür dönüştürme yapılması gerekip gerekmediğini görmek için önce türü denetler tahmin ediyorum . Bir ===sonraki adımda herhangi bir dönüşüm yapmayan, onu daha hızlı yapan şeydir.
deceze

25

Dikkate alınması gereken iki şey vardır:

  1. İşlenen türleri farklıysa ==ve farklı sonuçlar=== üretir . Bu durumda operatörlerin hızı önemli değildir; önemli olan hangisinin istenen sonucu verdiğidir.

  2. İşlenen türleri aynı ise o zaman kullanabilir ya ==ya ===her ikisi olarak üretecektir aynı sonuçları . Bu durumda, her iki operatörün hızı neredeyse aynıdır. Bunun nedeni, her iki işleç tarafından da tür dönüştürme yapılmamasıdır.

Hızını karşılaştırdım:

  • $a == $b vs $a === $b
  • nerede $ave $brasgele tamsayılardı [1, 100]
  • iki değişken oluşturuldu ve bir milyon kez karşılaştırıldı
  • testler 10 kez yapıldı

İşte sonuçlar:

 $a == $b $a === $b
--------- ---------
 0.765770  0.762020
 0.753041  0.825965
 0.770631  0.783696
 0.787824  0.781129
 0.757506  0.796142
 0.773537  0.796734
 0.768171  0.767894
 0.747850  0.777244
 0.836462  0.826406
 0.759361  0.773971
--------- ---------
 0.772015  0.789120

Hızın neredeyse aynı olduğunu görebilirsiniz.


13
başka bir şey yapmayan ve sadece ortalama çıktısı olmayan bir makinede milyarlarca yineleme yaparsanız ne olacağını merak ediyorum. burada çok fazla gürültü var gibi görünüyor. ;)
Gung Foo

4
Aynı sonuca vardım: Eğer işlenenlerin aynı türden olduğu biliniyorsa, hiçbir fark dağıtılamazdı. Diğer senaryolar bir anlam ifade etmiyor. Hemen hemen tüm diğer cevaplar yanlıştır.
Paul Spiegel

1
Bunun seçilen cevap olması gerektiğine inanıyorum. Sadece varsayımlarla rasyonelleşmez, varsayımlar deneysel olarak daha az cevherle test edilmiştir.
Pedro Amaral Couto

@PedroAmaralCouto Sanmıyorum, çünkü 10 deneysel bir çalışma değil. Neredeyse hiçbir fark olmamasının ana nedeni, PHP derleyicisinin muhtemelen kodu optimize etmesidir. Tür dönüşümü gerekmedikçe === kullanılmalıdır, semantik hatayı azaltmaya yardımcı olacaktır (tüm yaşamınızda bir kez olsa bile). Ayrıca, kodu okuyan bir sonraki kişiye hangi kuralların uygulandığına da yardımcı olur. Bir kez yazıyorsunuz, birkaç yüz kez okundu, eğer bir kişinin şüphesini gidermeye yardımcı olabilirse, zaten başarılı oldu. Ayrıca ampirik hafıza testi yok, aynı tipte klon beri. Sadece zamandan daha fazla kaynak var.
Marco

@Marco, "ampirik çalışma" dediğimde, bunu deneyime dayanıyor demek istiyorum, örneğin: destek için bir deney yapmadan, sadece mantık (veya aklınızdakileri) kullanarak bir argüman yapmak yerine kod çalıştırmak. Salman A değerleri === eşit olarak bazen biraz daha hızlı ve bazen biraz daha yavaş olduğunu göstermektedir. Bu "PHP'de === neden == 'den daha hızlı?" şu soruyu sorar: "=== == 'dan daha hızlı biliyor musunuz?" Derleyici optimizasyonları bir açıklamadır, ne daha hızlı ne de daha yavaş değil ve ne kullanılması gerektiğini söylemedim.
Pedro Amaral Couto

7

Gerçekten daha hızlı olup olmadığını bilmiyorum, ancak === çoğu dilde doğrudan bir tür karşılaştırma ise, == gerekirse / zorla bir eşleşme elde etmek için tip zorlama yapmaya çalışacaktır.


9
Javascript === operatörüne sahiptir.
Frank Shearar

Eminim === ortak lisp ve şemada yapabilirsiniz.
pupeno

Javascript - 3 langauge tanımında kontrol ettim;) Ve Lisp ve Scheme birçok şeydir, ancak pek yaygın değildir;)
TomTom

1
yakut === vardır. Aynı şeyi yapıp yapmadığını hatırlamak benim için çok uzun zaman oldu.
KitsuneYMG

1
Ayrıca, actionscript için livesocs.adobe.com/flash/9.0/ActionScriptLangRefV3/… . Temel olarak, google "katı eşitlik".
Chris

4

==, karşılaştırmadan önce tür dönüşümünün daha büyük olmasını sağlar. === önce türü kontrol eder, daha sonra herhangi bir tür dönüşümü yapmak zorunda kalmadan ilerler.



3

Sonuç olarak === daha hızlıdır, çünkü iki değişkenin aynı değere sahip olup olmadığını görmek için veri türünü dönüştürmeyin, ancak iki değişkenin aynı değere sahip olup olmadığını görmeniz gerektiğinde == kullanacaksınız , veya === önemli ise değişkenlerin türü de.


0

Daha hızlı bir şekilde yalnızca doğrudan yürütme zamanında ölçülmemelidir (bu durumda doğrudan performans testleri neredeyse önemsizdir). Bununla birlikte, (gerçekçi bir bağlamda kullanıldığında) önemli, kümülatif bir fark olup olmadığını gerçekten görmek için yineleme veya özyineleme içeren bir test görmem gerekir. Uç davalarla uğraşırken tasarruf edeceğiniz test ve hata ayıklama süresi sizin için de anlamlı olmalıdır.


0

Php (c kodu) değeri bir "sınıf" gibi:

class value
{
    $int_;
    $float_;
    $string_;
    $array_;
    $object_;
}

Senin karşılaştırarak zaman $a == $bve $aolan inttürü, gibi bir şey olacaktır:

if ($a->int_ == $b->int_ || $a->int_ == (int) $b->float_ || $a->int_ == (int) $b->string_ || ...)

ama string '1'ascii koduna dökülmeyecek 49, öyle olacak 1.

Karşılaştırdığınız zaman $a === $bve $aolan inttürü gibi Someting olacak:

if ($a->int_ == $b->int_)

-4

Test sonuçları doğruysa, derleyici sorunu olmalıdır,

İşlemci, bir saat döngüsünde söylendiği her şeyi yapacak

Yapacak daha az şey varsa, o zaman daha hızlı olacaktır

İlave:

Ah aslında eğer derleyici zaten işlenecek makine kodları bir sürü oluşturduysa, o zaman ne tür verilerin karşılaştırılması gerektiğini karşılamak için zilyonlarca şey eklediyse, o zaman bir "minör" IF'nin kaldırılması hızları çok fazla değiştirmez hiç.

Eğer kimse hala bunu okuyorsa, o zaman daha fazla tartışmada ilginçim.

Phil


Kod tabanınızda yalnızca "bir" EĞER deyimi var mı? Bu garip çünkü üzerinde çalıştığım her kod tabanında, her yerde binlerce IF veya karşılaştırmalı ifadeler var.
Lev
Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.