cevap

37

gün (CF8 +) hız farkı değildir büyük bir olduğu. Ancak, structKeyExists gerçekten biraz daha hızlı. İşte nedeni.

isDefined'u kullandığınızda, ilettiğiniz dize birkaç kapsamda anahtar adı olarak aranır. olduğunu kontrol amacıyla CF9, kapsamları listesinde itibariyle: (source)

  1. Yerel (işlev yerel, UDF ve sadece CFC'lere)
  2. Argümanlar
  3. Konu yerel (iç diş için)
  4. sorgu
  5. Konu
  6. değişkenler
  7. CGI
  8. (bir gerçek kapsamı, sorgu döngüler içinde değişkenler için de geçerlidir)
  9. CFFile
  10. URL
  11. Formu
  12. Kurabiye
  13. Müşteri

Eğer isDefined (örn: if isDefined('variables.foo')) ile kapsam adını kullanmak bile listesi hala sırayla kontrol edilecektir; ve local.variables.foo değişkeni tanımlanmışsa, BEFOREvariables.foo bulunabilir.

Diğer taraftan, structKeyExists yalnızca anahtar adın varlığı için ilettiğiniz yapıyı arar; Yani bakmak zorunda kalacağı daha az yer var.

Daha açık kod (structKeyExists) kullanarak, yalnızca bazı performanslar elde etmekle kalmaz, aynı zamanda kodunuz benim için daha okunaklı ve bakımlıdır.

+0

Çok iyi! İşlevleri farklı şekilde nasıl işlediğini görmek ilginç. –

+0

Ayrıca, ColdFusion'ın sağladığınız dizede bir değerlendirme çalıştırması gerektiğini düşünüyorum. StructKeyExists çok fazla çalışmayı engeller. –

+1

structKeyExists() 'ile büyük bir sorun var.Bir JSON dizgisini ColdFusion ile salıverirseniz ve 'null' değerine sahip bir 'myVal' özelliğiniz varsa, 'structKeyExists (object," myVal ")' 'true' yerine dönecektir, 'isDefined (" object.myVal ") yapmayacak. Başka bir deyişle, 'structKeyExists()' ile kontrol ettikten sonra 'object.myVal' ile mülke erişmeyi denerseniz, bir hata alırsınız. – android

10

'un hangisinin daha kolay olduğunu kullanın ve ne yaptığınızı gösterir.

Bu ikisi arasındaki fark inanılmaz derecede küçüktür ve büyük olasılıkla endişelenmeye değer değildir. Yavaşlık gösteren bir kanıtlanmış ve tekrarlanabilir test case yoksa

kod optimize zaman kaybetmeyin.

+1

+1. İki fonksiyonun nasıl çalıştığını * anlamak kesinlikle faydalıdır. Ancak, bir performans sorununuz yoksa, doğru bir şekilde davranabilen okunabilir kod yazmak çok daha önemli IMO'dur. – Leigh

+0

Tamamen aynı fikirdeyim, ancak hala normal bir structKeyExists kullanıcısıyım. Açık doğanın her şeyi berrak bir hale getirdiğini buldum, “her defasında değil”, eski kodlara (ve/veya başka birinin koduna) aylar veya yıllar sonra geri dönerken daha fazla zaman ve baş ağrısıyla sonuçlanır. –

+0

IsDefined() daha sezgisel olarak adlandırılmış olsa da, daha önce tanımladığınız şey, performans hakkında zamansız kaygılar olmaktan ötekini seçmek için hala daha iyi bir neden. En azından IMHO ;-) - Leigh 8 dak önce – Leigh

İlgili konular