Forum » Programiranje » c# cudne reci pri merjenju hitrosti simple for loopa
c# cudne reci pri merjenju hitrosti simple for loopa
Vapo1 ::
gre za simple incrementanje unsigned integerja 4 miljardokrat (na 3ghz computerju core 2 duo)... (ce bi sestevali 3 miljardokrat in bi cpu opravil v enem ciklu bi stvar teoreticno morala uzeti 1 sekundo)
prvi test vzame 6 sekund... drugi pa 10 sekund ... !!!! norost.. razlika pa je samov msgboxu... dejansko bi moral prvi test celo biti hitrejsi ker se timespan izvede pred msgboxom
pri prvem testu ce das namesto uint decimal in ga nastavis da steje isto ciklov(do 4294967296) stvar traja fuul dolgo.. 400 sekund se mi zdi.. kar je razumljivo ker decimal je 128 biten (se mi zdi) in terja ful vec operacij
ok...potem sem hotel se vse skupaj prevesti na 8 bitni integer (oz byte) da bi videl ce stvar hitreje opravi....in prispel do drugega cudnega primera
ker ima byte samo 256 vrednosti mora v vecih loopih steti da steje 4294967296 krat
razlika je samo v L++; v zadnjem loopu... enkrat incrementa tudi long L .. enkrat pa ne (enkrat je za-commentan drugic je od-commentan)
rezultat pa spet krneki... ko ne incrementa L spremenljivke traja 12 sekund... ko pa jo pa samo 10 sekund..... kar je v nasprotju s kakersno koli logiko....
(v tem CpuTestByte primeru sem probal experimentirati z timespani in messageboxi ki so ocitno problem pri prvem problemu (CpuTest1) in tukaj nima nobenega ucinka.. tako da je zgleda fora samo v long L spremenljivki)
anyway... ima kdo kaksne ideje??.. je to kriv c# ali se isti cirkus dogaja tudi v c++ ???
void CpuTest1() { DateTime DT = DateTime.Now; uint i = 0; i--; //nastavi uint na 4294967296 uint b = 0; while (b < i) { b++; } TimeSpan TS = DateTime.Now.Subtract(DT); MessageBox.Show(TS.ToString() + "\n" + b); } void CpuTest2() { DateTime DT = DateTime.Now; uint i = 0; i--; //nastavi uint na 4294967296 uint b = 0; while (b < i) { b++; } MessageBox.Show(DateTime.Now.Subtract(DT).ToString()); }
prvi test vzame 6 sekund... drugi pa 10 sekund ... !!!! norost.. razlika pa je samov msgboxu... dejansko bi moral prvi test celo biti hitrejsi ker se timespan izvede pred msgboxom
pri prvem testu ce das namesto uint decimal in ga nastavis da steje isto ciklov(do 4294967296) stvar traja fuul dolgo.. 400 sekund se mi zdi.. kar je razumljivo ker decimal je 128 biten (se mi zdi) in terja ful vec operacij
ok...potem sem hotel se vse skupaj prevesti na 8 bitni integer (oz byte) da bi videl ce stvar hitreje opravi....in prispel do drugega cudnega primera
ker ima byte samo 256 vrednosti mora v vecih loopih steti da steje 4294967296 krat
void CpuTestByte1() { DateTime DT = DateTime.Now; byte i = 0; i--; byte i1 = 255; byte i2 = 255; byte i3 = 255; byte i4 = 255; byte b1 = 0; byte b2 = 0; byte b3 = 0; byte b4 = 0; long L = 0; while (b1 < i1) { while (b2 < i2) { while (b3 < i3) { while (b4 < i4) { b4++; //L++; } b4 = 0; b3++; } b3 = 0; b2++; } b2 = 0; b1++; } TimeSpan TS = DateTime.Now.Subtract(DT); MessageBox.Show(TS.ToString() + "\n" + l); } void CpuTestByte2() { DateTime DT = DateTime.Now; byte i = 0; i--; byte i1 = 255; byte i2 = 255; byte i3 = 255; byte i4 = 255; byte b1 = 0; byte b2 = 0; byte b3 = 0; byte b4 = 0; long L = 0; while (b1 < i1) { while (b2 < i2) { while (b3 < i3) { while (b4 < i4) { b4++; L++; //razlika je samo v tej vrstici (ni za-commentana) } b4 = 0; b3++; } b3 = 0; b2++; } b2 = 0; b1++; } TimeSpan TS = DateTime.Now.Subtract(DT); MessageBox.Show(TS.ToString() + "\n" + l); }
razlika je samo v L++; v zadnjem loopu... enkrat incrementa tudi long L .. enkrat pa ne (enkrat je za-commentan drugic je od-commentan)
rezultat pa spet krneki... ko ne incrementa L spremenljivke traja 12 sekund... ko pa jo pa samo 10 sekund..... kar je v nasprotju s kakersno koli logiko....
(v tem CpuTestByte primeru sem probal experimentirati z timespani in messageboxi ki so ocitno problem pri prvem problemu (CpuTest1) in tukaj nima nobenega ucinka.. tako da je zgleda fora samo v long L spremenljivki)
anyway... ima kdo kaksne ideje??.. je to kriv c# ali se isti cirkus dogaja tudi v c++ ???
- spremenil: Senitel ()
darkolord ::
Pri meni sta oba testa praktično enako hitra. Oba testa zalaufaš enako?
Čisto možno je, da je razlika zaradi debuganja - če stvar skompajlaš v Release in ročno zalaufaš exe datoteko, bo stvar precej hitrejša (na mojem 2ghz procesorju traja 2 sekundi (13 sekund v debugu)).
Pa mimogrede, za take meritve se uporablja System.Diagnostics.StopWatch.
Čisto možno je, da je razlika zaradi debuganja - če stvar skompajlaš v Release in ročno zalaufaš exe datoteko, bo stvar precej hitrejša (na mojem 2ghz procesorju traja 2 sekundi (13 sekund v debugu)).
Pa mimogrede, za take meritve se uporablja System.Diagnostics.StopWatch.
Zgodovina sprememb…
- spremenilo: darkolord ()
Vapo1 ::
hvala kurcu ... dela !!
pa sem ze pomislil na to.. pa nisem probal...
ampak pomembno je da se ucim... System.Diagnostics.StopWatch praviš... se mi je zdelo da je timespan bolj kmecka resitev za take probleme.... bom preizkusil
hvala darkolord.. super si (do sedaj sem se vse odgovore dobil od tebe)
pa sem ze pomislil na to.. pa nisem probal...
ampak pomembno je da se ucim... System.Diagnostics.StopWatch praviš... se mi je zdelo da je timespan bolj kmecka resitev za take probleme.... bom preizkusil
hvala darkolord.. super si (do sedaj sem se vse odgovore dobil od tebe)
Senitel ::
Jaz bi rekel: "know your compiler." Veliko vprašanje kaj se tukaj zadaj sploh dogaja v C#. Visual C++ compiler bi te verjetno v vseh teh primerih pogruntal, da ne delaš nič pametnega in enostavno cel loop vn vrgel. Ne bi se čudil če C# pogrunta do neke mere isto.
Vapo1 ::
hej.. ce smo ze pri tem... a mi lahko se povesta ce se program kaj pohitri ce uporabljam byte namesto int... delam namrec nekaksen kalkulator... problem je nekako s enajbolj podoben kartam... uglavnem neskoncnokrat se primerjajo neke teviljke iznekih arayev..
ampak te steviljke imajo majhne vrednosti... in ne rabim intigerjevih 4 miljarde.. byteovih 256 vrednosti povsem zadostuje...
torej... a byte dela hitrejo od int?... ker procesorji so itak 32 bitni... in potem je se faktor c#... nekje sem slisal da je v c# tudi bool ubistvu 32 bit integer
ampak te steviljke imajo majhne vrednosti... in ne rabim intigerjevih 4 miljarde.. byteovih 256 vrednosti povsem zadostuje...
torej... a byte dela hitrejo od int?... ker procesorji so itak 32 bitni... in potem je se faktor c#... nekje sem slisal da je v c# tudi bool ubistvu 32 bit integer
Vapo1 ::
in ce je res faktor c#... a potem bi byte delal hitreje v C++ .... ali je faktor procesor in c++ ne bi bil nic hitrejsi
Senitel ::
Hitrostne razlike med byte in int ne bi smelo bit. Edina razlika je, da je int pač 4 byte velik.
Vredno ogleda ...
Tema | Ogledi | Zadnje sporočilo | |
---|---|---|---|
Tema | Ogledi | Zadnje sporočilo | |
» | C# problemOddelek: Programiranje | 1173 (882) | mladec |
» | c# kam lambda delegat shrani spremenljivke? (in njegov scope)Oddelek: Programiranje | 3036 (2594) | Sportmania |
» | c# base class, derived class, inheritance problemOddelek: Programiranje | 1387 (1266) | Vapo1 |
» | [C#] int v byte[] in nazajOddelek: Programiranje | 1790 (1562) | BlueRunner |
» | [c#] string.TrimOddelek: Programiranje | 1305 (1251) | darkolord |