Kodu optimize etmeyin !

8-11-2006

'Premature optimization is the root of all evil.'
Tony Hoare / Donald Knuth

OOP programlama ve .NET, Java gibi dillerin yaygınlaşması, encapsulation' ın her noktada kullanılması ile birlikte optimizasyon iyice geriye kaydı ve kaymalı.

Dört yıl kadar önce web tabanlı bir yazılım geliştirilirken ileri optimasyon tekniklerini inceliyordum, tekniklerin bazısı gerçekten çok basit şekilde yüksek kazançlar sağlarken (aynı .NET te büyük string operasyonlarında stringbuilder ı kullanmanın bariz farkı gibi) bazıları ise çok büyük uğraşlar sonucu çok küçük faydalar sağlıyordu.

Orta ölçekli potansiyeli beklenen bir site için ekstra 10 saat harcayıp, kodun kompleksitisini yükseltip sadece %01 gibi performans kazanmak yerine servera 256 RAM daha takmanın uygun olduğunu belirtmiştim, bugün de hala aynı şekilde düşünüyorum (tabii buradaki bir server yazılımı dolayısıyla donanım bizim kontrolümüzde).

Çok bariz bir şey var ki .NET, Java C' den genelde en az 10 kat yavaşlar bazen bu 50-100 kata kadar çıkabiliyor (yapılan araştırmalara göre ben burada çok atmışım, gözüken o ki .NET / Java genelde 3-10 kat yavaş gözüküyorlar. Java genelde .NET ten daha yavaş ve son olarak bir not normalde büyük uygulamalarda uygulama tipine göre bu yavaşlık biraz daha yükselebiliyor), dolayısıyla çok yüksek performans zaten bu dillerin birinci derdi değil, oyunun ilk turu sahaya çıkarken kaybedilmiş durumda.

İkinci tur, geliştirme optimizasyonu. Kod geliştirirken performans analiz ve plandan gelir. Taklacı güvercin taklidi yapabilen çılgın sort algoritmanızdan değil. Sizin o çılgın sort algoritmanız bir milyon kayıtta tamı tamına 1200 milisaniye, yani 1.2 hızlı çalışabilir ama maalesef bu program kullanıcısının sadece on binde birinin, bir milyondan fazla kaydı var ve olanlar da 1.2 saniye bekleyip daha iyi bir özelliğe veya daha stabil bir yazılıma hayır diyeceklerini sanmıyoruz. Bir diğer durumsa zaten programın kötü planlanmış akışı kullanıcıya performans açısından dakikalar kabettiriyor, memory' yi şekerle yumuşatılmış limonata hesabı içiyor olabilir.

Başa dönersek OOP geliştirme size büyük bir imkan veriyor fonksiyonlarınızda rutinlerinizde, classlarınızda encapsulation' ın hakkını verin ki gerektiği zaman daha güçlü ve daha efektif bir algoritma ile değiştirme şansınız olsun. Tabii ki bu tek getirisi değil iyi encapsulation sizi her zaman daha iyi bir yazılıma götürecektir.

Sonuç olarak yazılım geliştirirken optimizasyonu ikinci planda tutun, özellikle test-driven development desteği ile gereken yerleri daha sonradan optimize etmeniz çok daha kolay olacaktır. Rutinin nasıl çalışması gerektiğine odaklanın onu çalıştırın daha sonradan optimizasyon gelecektir.

Son bir hatırlatma bu yazıdan optimizasyon yapmayın sonucu çıkarmayın. Özellikle planlama aşamasında programın mantıklı olması ve performansı düşünmesi gereklidir. Eğer bir resmi bir klasörde dosyanın olup olmadığını kontrol ederken File.Exist() yerine klasördeki tüm dosyaları tarayıp string karşılaştırması yapıyorsanız buna zaten diyecek bir şeyimiz yok, o zaman daha ciddi sorunlarınız var demektir...

Recent Blog Posts

See all of the blog posts