Bu alıntıyı, kod ölçüsünü arttırmadan veya okunabilirliğinden ödün vermeksizin, performansının ölçülmemesine rağmen muhtemelen oldukça kolay bir şekilde daha hızlı bir şekilde yapılabilen hatalı kod veya kodu haklı çıkarmak için kullanıldığını sık sık gördüm.
Genel olarak, erken mikro optimizasyonların kötü bir fikir olabileceğini düşünüyorum. Bununla birlikte, makro optimizasyonlar (O (N ^ 2) yerine O (log N) algoritması seçmek gibi şeyler) genellikle faydalıdır ve bir O (N ^ 2) algoritması yazmak için zararlı olabilir; daha sonra O (log N) yaklaşımı lehine tamamen atın.
Kelimeleri olabilir : O (N ^ 2) algoritması basit ve yazılması kolaysa, çok yavaş olduğu ortaya çıkarsa daha sonra suçluluk duymadan fırlatabilirsiniz. Ancak, her iki algoritma da benzer şekilde karmaşıksa veya beklenen iş yükü zaten daha hızlı olana ihtiyacınız olduğunu bilecek kadar büyükse, erken optimizasyon yapmak, uzun vadede toplam iş yükünüzü azaltacak olan sağlam bir mühendislik kararıdır.
Bu nedenle, genel olarak, doğru yaklaşımın, kod yazmaya başlamadan önce seçeneklerinin ne olduğunu bulmak ve bilinçli olarak durumunuz için en iyi algoritmayı seçmek olduğunu düşünüyorum. En önemlisi, "erken optimizasyon tüm kötülüklerin köküdür" ifadesi cehalet için bahane değildir. Kariyer geliştiriciler, ortak işlemlerin maliyeti hakkında genel bir fikir sahibi olmalıdır; bilmeleri gerekir, örneğin,
- bu karakter dizileri rakamlardan daha pahalıya gelir
- dinamik dillerin statik olarak yazılmış dillerden çok daha yavaş olduğu
- dizi / vektör listelerinin bağlantılı listeler üzerindeki avantajları;
- bir karma tablo ne zaman, sıralı bir harita ne zaman ve bir yığın ne zaman kullanılır
- (mobil cihazlarla çalışıyorlarsa) "double" ve "int" masaüstlerinde benzer bir performansa sahiptir (FP daha hızlı olabilir) ancak "double" FPU'ları olmayan düşük kaliteli mobil cihazlarda yüzlerce kez daha yavaş olabilir;
- İnternet üzerinden veri aktarımı HDD erişiminden daha yavaş, HDD'ler RAM'den çok daha yavaş, RAM L1 önbellek ve kayıtlarından çok daha yavaş ve internet işlemleri süresiz olarak engelleyebilir (ve herhangi bir zamanda başarısız olabilir).
Ve geliştiriciler, iş için doğru araçları kolayca kullanabilmeleri için bir veri yapıları ve algoritmaları araç kutusuna aşina olmalıdır.
Bol miktarda bilgiye ve kişisel bir araç kutusuna sahip olmak neredeyse zahmetsizce optimize etmenizi sağlar. Gereksiz olabilecek bir optimizasyon içine çok fazla çaba koymak olduğunu kötülük (ve o tuzağa kereden fazla düşmekten itiraf). Ama optimizasyon listesini bir dizi yerine bir dizi / hashtable toplama veya depolama kadar kolay olduğunda sayılar çift [] yerine dize içinde [], o zaman neden olmasın? Burada Knuth'a katılmıyor olabilirim, emin değilim ama düşük seviye optimizasyondan bahsettiğini düşünüyorum, oysa yüksek seviye optimizasyondan bahsediyorum.
Unutmayın, bu alıntı aslen 1974'tür. 1974'te bilgisayarlar yavaştı ve hesaplama gücü pahalıydı; Bence bu Knuth'un buna karşı bastığı şeydi. “Performans hakkında endişelenme” demedi, çünkü 1974'te bu sadece çılgın bir konuşma olurdu. Knuth nasıl optimize edileceğini açıklıyordu ; Kısacası, kişi yalnızca darboğazlara odaklanmalı ve bunu yapmadan önce darboğazları bulmak için ölçümler yapmanız gerekir.
Ölçülecek bir program yazana kadar darboğazları bulamayacağınızı unutmayın; bu, ölçülecek bir şey olmadan önce bazı performans kararlarının alınması gerektiği anlamına gelir . Bazen yanlış karar alırsanız bu kararların değiştirilmesi zordur. Bu nedenle, ne kadar maliyetli olduğu konusunda genel bir fikre sahip olmak iyidir, bu nedenle herhangi bir zor veri bulunmadığında makul kararlar verebilirsiniz.
Optimize etmek için ne kadar erken ve performans konusunda ne kadar endişelenmek işe bağlı. Yalnızca birkaç kez çalıştıracağınız komut dosyaları yazarken, performans hakkında endişelenmek genellikle tam bir zaman kaybıdır. Ancak, Microsoft veya Oracle için çalışıyorsanız ve binlerce başka geliştiricinin binlerce farklı şekilde kullanacağı bir kitaplık üzerinde çalışıyorsanız , cehennemi optimize etmek için ödeme yapabilir; vakaları verimli kullanın. Buna rağmen, performans ihtiyacı her zaman okunabilirlik, bakım kolaylığı, şıklık, genişletilebilirlik vb. İhtiyaçlarla dengelenmelidir.