dallanmanın hıza etkisi?

Başlatan satilla, 17 Mart 2011, 20:33:48

satilla

program yazarken hep kafama takılıyor
program yazarken ufak bir kod parçası için dallanma yapmak mı iyidir yoksa o kodu her defasında yazmak mı?

her defasında yazmak kod hafızasından ödün vermek olabilir ama ileriye dönük geliştirilecek bir uygulama olmayacaksa ve yeterli alan varsa bunun sorun olacagını sanmıyorum

dallanma sırasında stack'ın boşalıp tekrar doldurulması zaman kaybına neden olur buda dallanmanın dezavantajı gibi görünüyor

sonuca gelirsek program içinde ufak bir kod öbeği için dallanma yapmak hızı ne kadar etkiler ?

Tagli

Hangi dil için konuşuyoruz? Assembly açısından bakarsak dallanma, yani call, yığında (stack) kapladığı yer dışında pek maliyetli değil. Gidiş - dönüş için harcanan 4 cycle'ı zaman kaybı olarak görmemek lazım.

Bu arada dallanma ifadesi pek açık değil. Bana göre goto da bir dallanmadır ama sanırım senin sorduğun bu değil.

Diğer diller için iş değişebilir. Örneğin C fonksiyonlarında argümanların aktarılması veya bazı register'ların yedeklerinin alınması zaman kaybı yaratabilir. Ama fonksiyon kullanmayı gerektirecek uzunlukta bir kod varsa, zaten yukarıda bahsettiğim işlemin oluşturduğu zaman kaybı, fonksiyon işleme süresine oranla düşük olacaktır. Bence bu mevzuya daha çok kesme kodlarında dikkat edilmeli. Derleyiciler "context save" işleminde bazen gerekmeyen şeyleri de yedekleyerek kesme kodunu şişiriyorlar.
Gökçe Tağlıoğlu

satilla

c18 kullanıyorum ve
void a()
{
PORTDbits.RD1=1;
NOP();
NOP();
NOP();
PORTDbits.RD1=0;
}

gibi bir ifadeyi ana programa dahil edip gerektigi yerde a(); diye cağırmak mı daha iyi yoksa her defasında yazmakmı?
eğer dediginiz gibi c'de bazı yedekler alınıyorsa a(); işlemini çağırmak biraz can sıkıcı çünkü şu an uğraştığım projede sürekli bu fonksiyon çağırılacak buda hızdan ödün vermek anlamına geliyor

Tagli

Ben olsam fonksiyonu kullanırdım. Zaten stack de 16 serisine kıyasla oldukça derin.  C18 biraz zeka belirtisi gösteriyorsa, bu fonksiyonun içinde zaten herhangi bir değişkene müdahale edilmediğini anlayacak (belki W istisna olabilir) ve herhangi bir yedekleme işlemi yapmayacaktır. Yine de emin olmak için disassembly'e bakmakta fayda var. Çünkü C18 konusunda pek deneyimim olmadığından, derleyicinin nasıl davrandığı konusunda kesin birşey söyleyemem. Ama hatırladığım kadarıyla kesmeye giderken, pek çok ıvır zıvır şeyin yedeğini alıyordu. Ancak öntanımlı davranışı değiştirmek mümkün, yani "Şunların da yedeğini al" veya "Hiçbir şeyin yedeğini alma" demek mümkün kesmelerde. Normal fonksiyonlarda da bu yapılıyor muydu hatırlamıyorum, araştırmak lazım.
Gökçe Tağlıoğlu