» »

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)

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.

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)

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

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 ...

TemaSporočilaOglediZadnje sporočilo
TemaSporočilaOglediZadnje sporočilo
»

C# problem

Oddelek: Programiranje
61161 (870) mladec
»

c# kam lambda delegat shrani spremenljivke? (in njegov scope)

Oddelek: Programiranje
223006 (2564) Sportmania
»

c# base class, derived class, inheritance problem

Oddelek: Programiranje
91377 (1256) Vapo1
»

[C#] int v byte[] in nazaj

Oddelek: Programiranje
131780 (1552) BlueRunner
»

[c#] string.Trim

Oddelek: Programiranje
51277 (1223) darkolord

Več podobnih tem