Konuyu görüntüle
IUCODERS FORUM > Programlama > Diğer (COBOL,asp php js..) > if-else-return tasarımı ve optimizasyonu hakkında
Yazar
clairvoyant


avatar
Antalya
Kayıt: 05.05.2006
20.11.2007-22:58 #31085
if (CONDITION) return true;
else return false;


Yukarıdaki gibi bir kod parçasında else teriminin optimizasyon ve tasarım açısından önemi nedir sizce? Bana else olmadığına kod daha optimize gibi görünüyor, fakat o zaman da algoritma tasarımı açısından güzel durmuyorumuş gibi geliyor. Tabii ki böyle tek bir if ifadesi için yorum yapmanın bir anlamı olduğunu düşünmüyorum ama daha komplex yapılarda bu konu bazen beni düşündürüyor.

Örneğin BOOL sonuç döndüren öyle bir fonksiyon yazıyorum ki, koddaki sonuç döndürmek için kurulmuş IF hiyerarşisindeki sadece tek bir yaprak TRUE döndürüyor. Diğer bütün yapraklarda "else return false" gibi bir ifade kullanmaktansa, IF hiyerarşisi sona erdikten sonra tek bir "return false" gibi bir ifadeyi kullanmayı tercih ediyorum. Bunun makine kodu miktarını ve yorumlayıcılarda (kaynak kod miktarı azaldığı için) da parsing zamanını azaltabileceğini tahmin ediyorum (bu tahminlerim gerçek dışı da olabilir). Ama dediğim gibi tasarım açısından da güzelliği bozuyormuş gibi geliyor.

Bu konudaki yorumlarınız nelerdir?





Let`s make this world a better place to live !

Yazar
orhan


avatar
istanbul
admin
Kayıt: 17.11.2005
20.11.2007-23:07 #31087
java için konuşursak
1.
 
if (..){
return..
}else{
return..
}


2.
 
if (..)
return..
else
return..


2. durum 1. durumdan daha az baytcode üretir.

 
boolean x=(..)?true:false

buda en az baytkodu üretir.

return olayına gelince eğer arada hata yakalama yada değer kontrolu filan yapmayacaksan. doğrudan return demekte fayda var.






N/A
Yazar
ridaniye


avatar
antalya
Kayıt: 26.04.2006
20.11.2007-23:23 #31090
Bu konuda benim de biraz fikrim var.

Dedigin durum icin net bir şey soylenemez. Mesela :
if(x>10) return 0;

if(x>5) return 1;

if(x>0) return 2;

return 3;


gibi bir fonksiyon da tabii ki "else" kullanmak mantıksız. Hız acısından ne kadar fark eder bilmiyorum ama kodun daha anlaşılır olmasını saglar bence. Bu da bakım, onarim çalışmalarını kolaylaştırır.

Ote yandan,


if(cnd1)
{
   if(cnd2)
   {
      ...
   }
   else /* if(cnd2) */
   {
      ...
   }
}
else /* if(cnd1) */
{
   if(cnd2)
   {
      ...
   }
   else /* if(cnd2) */
   {
      ...
   }
}


seklinde bir kod cogu zaman daha faydalı olabilir. Ici bos bile olsa else ifadelerini yazarsak, butun durumlara hakim olabiliriz. Ayrica sekilde goruldugu gibi "else" ifadelerinin yanina hangi "/* if(cnd2) */" seklinde yorumlar yazarak daha anlasilir kod yazilabilir.


Bir diger konu ise, kosulu kontrol etme oranini azaltmaya yonelik.

mesela:


if(a<8||a%4==0)
{
}


"a" 0-9 arasi deger alan bir degisken olarak dusunelim. bu durumda a nin 8 den dusuk olma ihtimali %80, a%4==0 ihtimali %30. Ve ya isleminde dogru kosulu bulunca diger kosullari kontrol etmez. Yani a<8 dogru ise diger kosula bakmaz. Boyle bir durumda kosullari, dgoru olma ihtimaline gore buyukten kucuge siralarsak daha az kontrol yaptırabiliriz. "Ve" isleminde de tam tersi gecerli tabii.

Ve son olarak Adaniak while(1!=2) yerine while(1) yazsa, bir islem tasarrufu yapılabilir :)

Bu ne kadar faydalidir tartisilir. Artik kac milisaniye hızlı calisir programlar bilemiyorum. Ama fikir fikirdir :)





Yazar
ali


avatar
istanbul
admin
Kayıt: 04.01.2006
20.11.2007-23:52 #31093
clairvoyant yazdi
 
if (CONDITION) return true;
else return false;


Yukarıdaki gibi bir kod parçasında else teriminin optimizasyon ve tasarım açısından önemi nedir sizce? Bana else olmadığına kod daha optimize gibi görünüyor, fakat o zaman da algoritma tasarımı açısından güzel durmuyorumuş gibi geliyor. Tabii ki böyle tek bir if ifadesi için yorum yapmanın bir anlamı olduğunu düşünmüyorum ama daha komplex yapılarda bu konu bazen beni düşündürüyor.

Örneğin BOOL sonuç döndüren öyle bir fonksiyon yazıyorum ki, koddaki sonuç döndürmek için kurulmuş IF hiyerarşisindeki sadece tek bir yaprak TRUE döndürüyor. Diğer bütün yapraklarda "else return false" gibi bir ifade kullanmaktansa, IF hiyerarşisi sona erdikten sonra tek bir "return false" gibi bir ifadeyi kullanmayı tercih ediyorum. Bunun makine kodu miktarını ve yorumlayıcılarda (kaynak kod miktarı azaldığı için) da parsing zamanını azaltabileceğini tahmin ediyorum (bu tahminlerim gerçek dışı da olabilir). Ama dediğim gibi tasarım açısından da güzelliği bozuyormuş gibi geliyor.

Bu konudaki yorumlarınız nelerdir?


Öncelikle şöyle başlamak istiyorum, bir kodun okunaiblirliğimi daha önemlidir yoksa hızlı çalışması mı? bu sorunun cevabı her daim okunabilirlikdir(istisnayi durumlar hariç tabi)

yazılan her if kodu bir kademe daha çatalandırır, işlemciye ek külfet getirir. ama illa if kullanmak gerekirse

if( x == 1){
return true;
} else {
 retrun false;
}


peki buna benzer bir durumda

if( x == 1){
return true;
}

 retrun false;


desydik ne olurdu: ife girerse ilk return girmezse ikinci return çalışırdı. ilk kodla hiç bir farkı yok ama okunabilirlik arttı. peki bir adaım daha ilerletip şu şekilde yapsaydım



boolean sonuc = false

if( x == 1 ){
sonuc = true;
}

 retrun sonuc;


büyük finalde elimizde okunabilirliği artmış, daha hızlı ve stabil bir kod olur biggrin






free software is a matter of liberty, not price. to understand the concept, you should think of free speech, not free beer.
Yazar
tarikkranda


avatar

Kayıt: 07.01.2006
21.11.2007-04:49 #31116
ali yazdi
 



boolean sonuc = false

if( x == 1 ){
sonuc = true;
}

 retrun sonuc;


büyük finalde elimizde okunabilirliği artmış, daha hızlı ve stabil bir kod olur biggrin


Okunabillirlik icin birsey diyemem, ama hız konusunda bu en yavas olanlardan birisidir bence:)) Stabiliteyse, digerlerinden bir fark yok, sadece extra alan tahsisatı var:)) Orhanın son yazdıgı ? operatoru tekli dondurumlerde tercih edilebilir ama bence buraya en cok yakısan:


if( x == 1 )
  return true;

 retrun false;


Ben boyle yazardım, gerisini de dusunmem. Git islemci al, ram al derdim:P








Yazar
kellad


avatar
istanbul
Kayıt: 21.01.2006
21.11.2007-09:07 #31119
Ben de bu şekilde yazmayı tercih ederim.
return (x == 1) ? x : y;


if( x == 1 )  return x;
_ _ return y;

Bu kod ise hem okunabilir hem hızlı oluyor.

Yok ben true/false döndüreceğim diyorsan o zaman şöyle yaparım.
return (x == 1);


Ama ben doğruysa yanlış, yanlışsa doğru döndürecektim dersen de şöyle olur.
return !(x == 1);

araya if sokmaya gerek yok.





Decompiling the code of universe.
Listening the cosmic background radiation.
Swimming in Inter Stellar Medium.
Yazar
tuuba


avatar
Bursa
Kayıt: 22.01.2007
21.11.2007-09:14 #31121
tarikkranda yazdi
 



if( x == 1 )
  return true;

 retrun false;


Ben boyle yazardım, gerisini de dusunmem. Git islemci al, ram al derdim:P




Bence de en doğrusuapplause

Ama merak ettiğim bişey var,sırf bu tarz verimlilik araştırmalarıyla uğraşan birileri var mıdır?Özellikle C gibi diller için.Ya da verimlilik ve okunabilirliğin ikisini de göz önüne alarak bu tarz bazı kalıplar için en doğru yazım şeklini standartlaştıranlar?????????





Yazar
onur


avatar
Two Story Town
Kayıt: 14.01.2006
21.11.2007-09:36 #31122
Google da

"application performance tricks"

"web application performance tricks"

"application performance tips & tricks"

seklinde aratirsan birseyler bulabiliyorsun.







Yazar
ali


avatar
istanbul
admin
Kayıt: 04.01.2006
21.11.2007-09:45 #31123
	.file	"1.c"
	.section .text
	.p2align 4,,15
.globl _f
_f:
	pushl	%ebp
	movl	%esp, %ebp
	cmpl	$1, 8(%ebp)
	sete	%al
	andl	$255, %eax
	popl	%ebp
	ret
	.p2align 4,,15
.globl _main
_main:
	leal	4(%esp), %ecx
	andl	$-16, %esp
	pushl	-4(%ecx)
	pushl	%ebp
	movl	%esp, %ebp
	pushl	%ecx
	popl	%ecx
	popl	%ebp
	leal	-4(%ecx), %esp
	ret
	.ident	"GCC: (GNU) 4.2.1"


optimizasyonu açık bırakınca ikisinde de aynı kod üretilir biggrinbiggrinbiggrin
tartışmaya gerek yok. istediğiniz gibi yazın derleyici gene kafasına göre çeviriyor, sonuc çoğunlukla aynı oluyor.biggrin





free software is a matter of liberty, not price. to understand the concept, you should think of free speech, not free beer.
Yazar
orhan


avatar
istanbul
admin
Kayıt: 17.11.2005
21.11.2007-11:17 #31130
ali yazdi
 

optimizasyonu açık bırakınca ikisinde de aynı kod üretilir biggrinbiggrinbiggrin
tartışmaya gerek yok. istediğiniz gibi yazın derleyici gene kafasına göre çeviriyor, sonuc çoğunlukla aynı oluyor.biggrin

hacim elinde borland c compiler yada M$ VS varsa onla da compile edebilir misin?





N/A
Yazar
clairvoyant


avatar
Antalya
Kayıt: 05.05.2006
21.11.2007-22:38 #31196
tuuba yazdi
 
Ama merak ettiğim bişey var,sırf bu tarz verimlilik araştırmalarıyla uğraşan birileri var mıdır?Özellikle C gibi diller için.Ya da verimlilik ve okunabilirliğin ikisini de göz önüne alarak bu tarz bazı kalıplar için en doğru yazım şeklini standartlaştıranlar?????????

Ben mesela. smugbiggrin
Benim bakış açıma göre yazdığın kod üzerinde yapabileceğin bir optimizasyon varsa yapacaksın.

Yorumlar için teşekkürler arkadaşlar. Güzel şeyler çıkıyor gerçekten. Onur'un dediği gibi google amcaya da başvurabilirdik ama google amcada böyle şeyler aratınca neden bizim site de o listede yer almasın di mi. :D





Let`s make this world a better place to live !

Yazar
ali


avatar
istanbul
admin
Kayıt: 04.01.2006
21.11.2007-23:31 #31202
orhan yazdi
 

hacim elinde borland c compiler yada M$ VS varsa onla da compile edebilir misin?


Borlandda aynı sonucu veriyo. MS de denemedim :)

işin özü şu, çok if kullanmayacaksın, kullandın diyelim çok return yazmayacaksın. yazarsan nolur hiç bişey olmaz, yazmassan nolur hataları daha kolay görürsün kod güzel olur. optimizasyonu derleyici yapıyor nasıl olsa biggrin yaz yazabildiğin kadar kardeşim





free software is a matter of liberty, not price. to understand the concept, you should think of free speech, not free beer.
Yazar
orhan


avatar
istanbul
admin
Kayıt: 17.11.2005
21.11.2007-23:57 #31205
ali yazdi
 

işin özü şu, çok if kullanmayacaksın, kullandın diyelim çok return yazmayacaksın. yazarsan nolur hiç bişey olmaz, yazmassan nolur hataları daha kolay görürsün kod güzel olur. optimizasyonu derleyici yapıyor nasıl olsa biggrin yaz yazabildiğin kadar kardeşim

derlerki kodunda ne kadar if varsa okadar acemisindir. :)

birde arkanızdan küfredilmesini istemiyorsanız koda 1-2 satır comment koyunuz :)





N/A
Del.icio.us
Digg
Facebook
Furl
Google
Blink
Simpy
Spurl
Y! MyWeb