Kodu optimize etmeyin !

08.11.2006

Okuyucu : 1.662
Günlük Okuyucu : 3

'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...

Yorumlar

RSS Bu makalenin yorumlarını RSS ile takip et!

Katılıyor ve çok yerinde bir yazı olmuş diyorum. ;)

Neset KABAKLI [ # | 08.11.2006 ]

10 kat daha yavas ve hatta 100 kat daha yavas gorusune katilmiyorum.

Bahsi geçen optimizasyona harcanacak zamanın üretime kaydırılmasında fayda sağlayacağımız küçük projelerde yada sadece business kodlanan veritabani projelerinde bu kadar bariz bir fark olmasi imkansiz. DirecX vs kullaniyorsak da zaten .Net direk olarak DirectX fonksiyonlarini kendisi çağırdığı için bu kadar bariz bir fark olmayacaktır. Kaybedilen hiz sadece type kontrolleri ve developer a fayda sağlamak adına yapılan null check vs. islemlerindedir.

Ama bir for dongusu icinde 10 milyon kere bir integer i artirmak %10 dan fazla bir zaman kaybettirmeyecektir.

Sunu da unutmamak lazim.

myObj.myProp.myColl[i].AddValue(a);
myObj.myProp.myColl[i].AddValue(b);
myObj.myProp.myColl[i].AddValue(c);

Yazmak yerine
myType myObj2 = myObj.myProp.myColl[i];
myObj2.AddValue(a);
myObj2.AddValue(b);
myObj2.AddValue(c);

turunden yazim aliskanliklarini optimizasyon olarak degerlendirmek gerektigini dusunuyorum.

Zübeyr Dereli [ # | 09.11.2006 ]

DirectX icin .NET in su an ozel destegi var bir cok benzeri projeler icinde geliyor aksi takdirde bunlari .NET te sifirdan yazmayi dusunemeyiz ama normalde bunlar C/C++ beklki biraz da ASM ile gelistirilmis projeler.

Ama genel olarak biraz benzer performans karsilarstirmalarina bakmaya calistim genelde 3-10 kat civarinda gozukuyor. Hakikaten abartmisim, bana nedense cok daha fazla gibi gozukuyordu.

Yazim performansi mantikli olsa da aslinda bu isleri compiler in halletmesi gerekiyor.

Mesela

x = x+1 ile x++ artik cogu compilerda managed / native ayni compile ediliyor ama eskiden x++ yazmak daha performansliydi.

Yukaridaki kodun MSIL ciktisi hakkinda bir fikrim yok ancak compiler in analiz edip optimize edebilecegi bir yapi aslinda ve bence yapmasi gerekiyor bence, yapmayincaya kadar tabii is kodu gelistirenlere dusuyor.

Ferruh Mavituna [ # | 09.11.2006 ]

bana yorum kodu bulun kardeşim

bilgiedin [ # | 15.01.2007 ]

Yorum Ekle





Kullanılabilir Taglar : [<blockquote>] [<strong>] [<em>]

Kodu optimize etmeyin ! ile İlişkili Olabilecek Yazılar - Haberler

Tekerleği Yeniden Keşfetmeyin
Korsan Yazılımsız İki Yıl
Pragmatic Programmer Notları
OSX' i Windows' a Benzetme
.NET ile Object Pool

Diğer Yazılar

Neredeyim ?

Ferruh.Mavituna » Haberler » Kodu optimize etmeyin !

Ferruh Mavituna
© 2002-2007, Ferruh Mavituna

Sabit IP Adresi : 81.22.99.133, SSL Erişimi, Hakkında