Ne moreš da verjameš (C#)

Nasveti za druge programske jezike.
kuskus
Prispevkov: 277
Pridružen: 08.12.2002 17:27:44

Ne moreš da verjameš (C#)

Odgovor Napisal/-a kuskus » 29.03.2007 23:08:01

Kaj je bolje (beri: optimalno)?

a)
int len = array.Length();
for (int i = 0; i < len; ++i)
{
array = 0;
}

ali b)
for (int i = 0; i < array.Length(); ++i)
{
array = 0;
}

Odgovor je b).
Svašta.

lp://k
Zadnjič spremenil kuskus, dne 29.03.2007 23:08:42, skupaj popravljeno 1 krat.

GJ
Prispevkov: 1078
Pridružen: 13.03.2004 12:34:48

Ne moreš da verjameš (C#)

Odgovor Napisal/-a GJ » 29.03.2007 23:42:32

In kaj je tukaj čudnega???

LP GJ
Kdor se zadnji smeje, se smeje zadnji!

aoven
Prispevkov: 2338
Pridružen: 27.06.2001 23:56:07

Ne moreš da verjameš (C#)

Odgovor Napisal/-a aoven » 30.03.2007 00:02:10

Na pamet: glede na to, da inicializiraš celoten array na 0, je povsem mogoče, da je pri drugi metodi prevajalnik to zaznal in namesto zanke uporabil kaj bolj učinkovitega. To je lahko preveriti - spremeni telo zanke v array = i;

Aleksander

GJ
Prispevkov: 1078
Pridružen: 13.03.2004 12:34:48

Ne moreš da verjameš (C#)

Odgovor Napisal/-a GJ » 30.03.2007 00:37:51

Na pamet: glede na to, da inicializiraš celoten array na 0, je povsem mogoče, da je pri drugi metodi prevajalnik to zaznal in namesto zanke uporabil kaj bolj učinkovitega. To je lahko preveriti - spremeni telo zanke v array = i;


Ahh..

Po definiciji for zanke je uganka povsem jasna..
Paskalsko gledano..
Če ge rečemo:

Koda: Izberi vse

For a := 0 to b do ...
  
Mora biti b konstanta!!!
Prevajalnik torej vedno postavi variablo b v interno konstanto, lahko je to kar CPU register ali pa jo vrže na stack!
Ker b med izvajanjem zanke lahko spremeni vrednost bi posledično nastal bug (b bi tako lahko postal < od vrednosti a kar pomeni, da bi zanka trajala dokler se register b nebi obrnil), ker pa je b konstanta, do bug-a ne pride, seveda če ne krajšaš v zanki dolžine arraya (če je array statičen tega tako ali tako ne moreš)..;)
Dober prevajalnik seveda lahko predvidi, da se b v zanki ne spreminja vendar si potem brez potrebe ustvaril novo variablo b.
Odgovor je torej povsem jasen!

LP :D GJ
Zadnjič spremenil GJ, dne 30.03.2007 00:41:30, skupaj popravljeno 1 krat.
Kdor se zadnji smeje, se smeje zadnji!

aoven
Prispevkov: 2338
Pridružen: 27.06.2001 23:56:07

Ne moreš da verjameš (C#)

Odgovor Napisal/-a aoven » 30.03.2007 01:26:13

Odgovor je torej povsem jasen!
Iz tega, kar si povedal, nič kaj bolj kot prej. Pokazal si kvečjemu nasprotno - da bi morali obe metodi sproducirati enak rezultat. Kuskusa pa matra ravno to, da ni tako.

Aleksander

GJ
Prispevkov: 1078
Pridružen: 13.03.2004 12:34:48

Ne moreš da verjameš (C#)

Odgovor Napisal/-a GJ » 30.03.2007 08:02:29

Iz tega, kar si povedal, nič kaj bolj kot prej. Pokazal si kvečjemu nasprotno - da bi morali obe metodi sproducirati enak rezultat. Kuskusa pa matra ravno to, da ni tako.
Ti ti.. Aleksander..:roll:
Kuskus je govoril o optimalnosti in ne o rezultatu!

No bom malo olajšal uganko tistim, ki ne poznajo konvencije for stavka.. :)

Koda: Izberi vse

 
procedure TForm1.FormCreate(Sender: TObject);
var
 s: ShortString;
 n, m: cardinal;
begin
  s := '0123456789';
  m := Length(s);
  for n := 1 to m  do
  begin
    m := 5;
    Caption := s[n];
  end;
end;
 

Kaj bo pisalo na na Formi pod caption, ko kličeš tole proceduro???

LP :D GJ
Zadnjič spremenil GJ, dne 30.03.2007 08:04:13, skupaj popravljeno 1 krat.
Kdor se zadnji smeje, se smeje zadnji!

Uporabniški avatar
gabr
Prispevkov: 4129
Pridružen: 28.08.2001 14:10:47

Ne moreš da verjameš (C#)

Odgovor Napisal/-a gabr » 30.03.2007 08:14:48

Kaj ima to zveze s Cisom?

Poglej IL za obe zanki, pa bo jasno (meni se ne da).

Gp

GJ
Prispevkov: 1078
Pridružen: 13.03.2004 12:34:48

Ne moreš da verjameš (C#)

Odgovor Napisal/-a GJ » 30.03.2007 08:52:53

Kaj ima to zveze s Cisom?

Poglej IL za obe zanki, pa bo jasno (meni se ne da).
Ti ti, Gabr pa ne še ti..:D
Sej ni kaj gledat, če delaš primerjavo z..

Koda: Izberi vse

  for n := 1 to Length(s)  do
  begin
    m := 5;
    Caption := s[n];
  end; 
Konvencija pravi, da mora biti v našem primeru to Length(s) konstanta. Torej je prelaganje Length(s) v m pa pol še enkrat m v interno konstanto čista izguba časa, gledano tako programsko kot tudi programersko! ;)

LP GJ
Kdor se zadnji smeje, se smeje zadnji!

Uporabniški avatar
gabr
Prispevkov: 4129
Pridružen: 28.08.2001 14:10:47

Ne moreš da verjameš (C#)

Odgovor Napisal/-a gabr » 30.03.2007 08:57:26

To je Pascal in ono je C#, človek. Kdo pravi da veljajo ista pravila? In da se prevajalnik enako obnaša?

Gp

GJ
Prispevkov: 1078
Pridružen: 13.03.2004 12:34:48

Ne moreš da verjameš (C#)

Odgovor Napisal/-a GJ » 30.03.2007 09:31:53

To je Pascal in ono je C#, človek. Kdo pravi da veljajo ista pravila? In da se prevajalnik enako obnaša?
Gabr pa sej ne morm verjet..
Poglej recimo..
Developer's Guide Coding Standards Document pod 'for Statements' po pa še ANSI C standard.

LP GJ
Kdor se zadnji smeje, se smeje zadnji!

Odgovori