Normalde "erken optimizasyon" kelimesinden nefret ederim, ama bu tam anlamıyla. Knuth'un bu ünlü alıntıyı goto
, kritik alanlarda kodu hızlandırmak için ifadeleri kullanmaya itme bağlamında kullandığını belirtmekte fayda var . Anahtar bu: kritik yollar.
goto
Kodu hızlandırmak için kullanmayı , ancak eleştirel olmayan kod için önsezilere ve batıl inançlara dayanarak bu tür şeyler yapmak isteyen programcılara karşı uyarıda bulunmasını önerdi .
Bir kod temeli boyunca switch
mümkün olduğu kadar eşit bir şekilde ifadeleri tercih etmek (herhangi bir ağır yükün işlenip yüklenmediğine bakılmaksızın), Knuth'un "optimize edilmiş" durumlarını korumak için çaba harcayarak tüm gününü harcayan "kuruşlu ve palavra" aptal programcısı olarak adlandırdığı klasik bir örnektir. msgstr "" Pennies'i pound'lardan kurtarmaya çalışmaktan kaynaklanan bir hata ayıklama kabusuna dönüşen kod. Böyle bir kod, ilk etapta bile verimli olmasa bile nadiren korunur.
O haklı mı?
Çok temel verimlilik perspektifinden doğrudur. Bilgime göre hiçbir derleyici nesneleri ve dinamik gönderimi içeren polimorfik kodu bir switch ifadesinden daha iyi optimize edemez. Polimorfik kodlardan gelen sıralı koda bir LUT veya atlama tablosu ile asla bitmeyeceksiniz, çünkü böyle bir kod derleyici için optimize edici bir bariyer işlevi görür (dinamik işlevin hangi zamana kadar çağrılacağını bilemez) ) meydana gelir.
Bu maliyeti zıplama tabloları olarak düşünmemek daha iyidir, ancak optimizasyon engeli açısından daha fazladır. Polimorfizm için, çağrı Base.method()
derleyicinin method
sanalsa, kapalı değilse ve geçersiz kılınabiliyorsa hangi işlevin çağrılacağını bilmesine izin vermez . Hangi fonksiyonun önceden çağrılacağını bilmediğinden, fonksiyon çağrısını optimize edemez ve optimizasyon kararları almak için daha fazla bilgi kullanamaz, çünkü aslında hangi fonksiyonun çağrılacağını bilmez. Kodun derlendiği saat.
En iyi duruma getiriciler, bir işlev çağrısına bakabildiklerinde ve arayanı ve arayanı tamamen düzleştiren veya en azından arayanı arayanla en verimli şekilde çalışacak şekilde optimize edecek optimizasyonlar yaptıkları zaman ellerinden gelenin en iyisini yaparlar. Önceden hangi işlevin çağrılacağını bilmiyorlarsa bunu yapamazlar.
Sadece kıçından mı konuşuyor?
Genellikle para birimlerine denk gelen bu maliyetin, bunu tek tip bir şekilde uygulanan bir kodlama standardına dönüştürmek için haklı gösterilmesi, özellikle genişletilebilirlik ihtiyacı olan yerler için çok aptalcadır. Gerçek prematüre optimize edicilerle dikkat etmek istediğiniz en önemli şey budur: küçük performans kaygılarını, her ne kadar olursa olsun bakımdan bağımsız olarak, bir kod tabanı boyunca aynı şekilde uygulanan kodlama standartlarına dönüştürmek isterler.
Ben onlardan biri olduğum için kabul edilen cevapta kullanılan "eski C hacker" alıntıya biraz alıyorum. Çok sınırlı bir donanımdan başlayarak yıllarca kodlayan herkes erken bir optimizasyona dönüşmedi. Yine de bunlarla da karşılaştım ve çalıştım. Ancak bu türler asla dal yanlışlığı veya önbellek özlüyor gibi şeyleri ölçmezler, daha iyi bildiklerini düşünürler ve verimsizlik kavramlarını, bugün gerçek olmayan ve bazen de asla doğrulanmayan batıl inançlara dayanan karmaşık bir üretim kod tabanında kullanırlar. Performans açısından kritik alanlarda gerçekten çalışmış kişiler genellikle etkili optimizasyonun etkin önceliklendirme olduğunu anlarlar ve para biriktirmek için korunabilirliği azaltan bir kodlama standardı oluşturmayı denemek çok etkili olmaz.
Pennies, çok sıkı, performans açısından kritik bir döngüde milyar kez denilen çok fazla iş yapmayan ucuz bir işleve sahip olduğunuzda önemlidir. Bu durumda, 10 milyon doları biriktirdik. Vücudun sadece binlerce dolara mal olduğu, iki kez denen bir işleve sahip olduğunuzda tıraş paraları değmez. Araba satın alırken zamanınızı para kazanmak için harcayacaksınız akıllıca değil. Bir üreticiden milyonlarca kutu soda satın alıyorsanız, para kazanmaya değer. Etkili optimizasyonun anahtarı, bu maliyetleri uygun bağlamda anlamaktır. Her bir satın alımda para biriktirmeye çalışan ve ne satın alırsa alsın, herkesin para kazanmaya kalkıştığını söyleyen biri yetenekli bir optimizer değil.