Yazılımda performans ve optimizasyon

Böyle mi yazamak, yoksa böyle mi tercih edersiniz:
Daha once de iki kere soyledigim gibi bunu;

Kod:
internal void ResponsiveSizeApply()
{
    bool maximized = mainWindow.WindowState is WindowState.Maximized;
    int size, top;
    if (userSettings.TitleBarVisible)
    {
        top = Constants.VERTICAL_MARGIN_TOP;
        size = sizeInt32.Height - (maximized ? Constants.VERTICAL_MINSIZE_MAX : Constants.VERTICAL_MINSIZE);
    }
    else
    {
        top = maximized ? Constants.VERTICAL_MARGIN_TOP_MAX : Constants.VERTICAL_MARGIN_TOP_V;
        size = sizeInt32.Height;
    }
    NavViewVertical.Margin = new Thickness(NavViewVertical.Margin.Left, top, NavViewVertical.Margin.Right, NavViewVertical.Margin.Bottom);
    NavViewVertical.MinHeight = size;
}

Daha okunabilir oldugunu dusunuyorum.
Ama bana sorarsan bir numarayi okumak kat ve kat daha kolay.
Evet. Ilki daha okunabilir, ikinci kagit ustunde daha "optimize" cunku ayni islemleri daha az sayida ara elemanla yapiyorsun.
1 numara yada ilki diye bahsettigimde suan alintiladigim koddan bahsediyordum hep.
 
Daha once de iki kere soyledigim gibi bunu;

Kod:
internal void ResponsiveSizeApply()
{
    bool maximized = mainWindow.WindowState is WindowState.Maximized;
    int size, top;
    if (userSettings.TitleBarVisible)
    {
        top = Constants.VERTICAL_MARGIN_TOP;
        size = sizeInt32.Height - (maximized ? Constants.VERTICAL_MINSIZE_MAX : Constants.VERTICAL_MINSIZE);
    }
    else
    {
        top = maximized ? Constants.VERTICAL_MARGIN_TOP_MAX : Constants.VERTICAL_MARGIN_TOP_V;
        size = sizeInt32.Height;
    }
    NavViewVertical.Margin = new Thickness(NavViewVertical.Margin.Left, top, NavViewVertical.Margin.Right, NavViewVertical.Margin.Bottom);
    NavViewVertical.MinHeight = size;
}

Daha okunabilir oldugunu dusunuyorum.


1 numara yada ilki diye bahsettigimde suan alintiladigim koddan bahsediyordum hep.
Şimdi daha iyi anlıyorum.
Dedigim gibi, dikkate alinabilir bir performans farki olmayacak cunku.
Şuana kadar bu ve bunun gibi cümleleri gördüğümde direkt 2. seçenek canlanıyordu kafamda da ondan. Kime sorsam 2. seçeneğin dikkate alınacak fark olmadığını söylüyor. Evet belki haklılar ancak yine de daha iyi olması, daha iyidir mantığını savunuyorum :D

Peki son bir şey daha soracağım burda çok kararsız kaldım. (2. eliyeceğim kesin de yine de göstermek istedim)
Her branchta şart mı?
Her branchta atama mı?
Her branchta değişken atama ve en sonda değişkeni atama mı?

1. Örnek:
C#:
bool visible = appTitleBar.Visibility is not Visibility.Visible;
int navViewVerticalTop = visible
                       ? VERTICAL_MARGIN_TOP : VERTICAL_MARGIN_TOP_NOTVISIBLE;
appTitleBar.Visibility = visible
                       ? Visibility.Visible : Visibility.Collapsed;
userSettings.TitleBarVisible = visible;
NavViewHorizontal.IsBackButtonVisible = visible
                                      ? NavigationViewBackButtonVisible.Visible
                                      : NavigationViewBackButtonVisible.Collapsed;
NavViewVertical.Margin = new Thickness(NavViewVertical.Margin.Left,
                                       navViewVerticalTop,
                                       NavViewVertical.Margin.Right,
                                       NavViewVertical.Margin.Bottom);
2. Örnek:
C#:
bool visible = appTitleBar.Visibility is not Visibility.Visible;

if (visible)
{
NavViewVertical.Margin = new Thickness(NavViewVertical.Margin.Left,
                                       VERTICAL_MARGIN_TOP,
                                       NavViewVertical.Margin.Right,
                                       NavViewVertical.Margin.Bottom);
....
}
else
{

NavViewVertical.Margin = new Thickness(NavViewVertical.Margin.Left,
                                       VERTICAL_MARGIN_TOP_NOTVISIBLE,
                                       NavViewVertical.Margin.Right,
                                       NavViewVertical.Margin.Bottom);
...
}

3. Örnek:

C#:
bool visible = appTitleBar.Visibility is not Visibility.Visible;
int navViewVerticalTop;
Diğer değişkenler...
if(visible)
{
    navViewVerticalTop = VERTICAL_MARGIN_TOP;
    ...
}
else
{
    ...
}
En son hepsine atamak. Örneğin:
NavViewVertical.Margin = new Thickness(left, navViewVerticalTop, right, buttom)

Anladığım ve düşündüğüm kadarıyla:
1. Yöntem CPU'ya,
3. Yöntem RAM'e daha çok ihtiyaç duyuyor.
2. Yöntem ise ikisine de.

Hem performans hem de okunabilirlik açısından hangi yöntemi tercih edersiniz?

Yazdığımı tam anlatamamış olabilirim. Ama anlayabileceğinizi umuyorum. Bu tür ufak örnekleri değilde bu örneklerin belki 10 belki 100 katı büyüklüğünü göze alarak düşünün.

1. Yöntem sürekli sürekli cpu,
3. Yöntem yöntem ise sürekli RAM'e, GB'ye, GB'ye iş çıktığı için yine CPU'ya yüklenecek.
 
Son düzenleme:
Yazdığımı tam anlatamamış olabilirim. Ama anlayabileceğinizi umuyorum. Bu tür ufak örnekleri değilde bu örneklerin belki 10 belki 100 katı büyüklüğünü göze alarak düşünün.
JIT compile sirasinda optimize edilecek. Cok onemi yok. .NETJIT Compilerin optimizasyonlari C/C++ optimizasyonlari kadar agresif olmaz ama yine de agresif optimizasyonlar yapacak ve muhtemelen eninde sonunda 1. ve 2. ornek ayni yada yaklasik benzer ASM'a derlenip performansa gram etkisi olmadan kalacak. Ama 2. ornek cok daha okunabilir olacak. 3. yontemse sandigin kadar GC'ye yuklenmeyecek. JIT akilli demistim daha once de. Sen sunu yaptiginda;
bool visible = <condition>;
if (visible) { ... }

Eger tek kez kullaniyorsan, aslinda sunu yapmak istedigini anlayip bu sekilde optimize ediyor;
if (<condition>) { ... }

Ayni kosulu, farkli ikinci bir kosulla yazdiginda da if (condition1 && condition2) { ... } else if (condition1 && condition3) { ... } dediginde condition1'i kendi ayri bir degiskene cevirebiliyor mesela. Gibi gibi.

Kodunda da bu tarz micro optimizasyonlara cok zorlamana gerek yok. Optimizasyon icin okunabilirligi bozmamak gerek. Ben genelde 2 veya 3 arasinda kalirim. Code clutter olmasin diye 3 gibi yaptigimda olur, ama bazen okumasi kisa oldugu icin 2 gibi yaptigimda olur.

Ucuncu ornekte de primitiveler stackte olacagi icin GC icin cok bir dert degil.

1. net okunabilirligin icinden geciyor bence. Ternary operator suistimali gibi geliyor.

Yani bu tarz micro optimizasyonlar yerine daha macro optimizasyonlara odaklanmak lazim. Looplar, thread/task management, I/O bound islemlerin sayisini azaltmak vs vs.
 

Technopat Haberler

Yeni konular

Geri
Yukarı