Go Back   De Unix-en Linux Forum > Top Forums > Programmering
.
Google Site



Programmering Post vragen over C, C + +, Java, SQL, en andere programmeertalen hier.

Closed Thread
English Japanese Spanish French German Portuguese Italian Powered by Powered by Google
 
Thread Tools Zoeken in deze Thread Rate Thread Display Modes
  #1 (permalink)  
Old 09.07.2009
Geregistreerde gebruiker
 

Join Datum: maart 2009
Posts: 137
Weird timing resultaten in C

Ik liep een aantal tijdstippen in mijn code om te zien welke van de verschillende functies was de beste en ik heb steeds een aantal vreemde resultaten. Hier is de code die ik heb gebruikt:

Code:
static double time_loop(int (*foo)(int)) {
	clock_t start, end;
	int n = 0, i = 0;
	start = clock();
	for (; i <= MAXN; i++)
		if ((*foo)(i)) n++;
	end = clock();
	if (n != 50847534)
		return -1;	// Error
	return ((double) (end - start)) / CLOCKS_PER_SEC;
}

static double median3(int (*foo)(int)) {
	double t1 = time_loop(foo);
	double t2 = time_loop(foo);
	double t3 = time_loop(foo);
	printf("  ((%f %f %f))\n", t1, t2, t3);
	int errors = 0;
	if (t1 < 0)
		errors++;
	if (t2 < 0)
		errors++;
	if (t3 < 0)
		errors++;
	if (errors > 0)
		return -errors;
	if (t1 > t2) {
		if (t2 > t3)
			return t2;
		return t3 < t1 ? t3 : t1;
	} else {
		if (t1 > t3)
			return t1;
		return t3 < t2 ? t3 : t2;
	}
}

De functies die ik overgaan naar time_loop zijn pure functies - ze zijn niet het doen van eventuele wijzigingen van globale variabelen. En toch iedere keer dat ik dit, mijn debugging lijn in median3 blijkt dat de derde aanroeping duurt aanzienlijk langer dan de anderen. Sample run:

Code:
  ((4.560000 3.750000 6.540000))
Original: 4.560000 s
  ((4.920000 3.760000 6.690000))
Original: 4.920000 s
  ((4.190000 3.750000 6.620000))
Original: 4.190000 s
  ((3.820000 3.130000 5.640000))
New:      3.820000 s
  ((3.580000 3.150000 5.580000))
New:      3.580000 s
	  ((3.670000 3.140000 5.510000))
New:      3.670000 s

Waarom is dat? Deze functies zijn volledig deterministisch, en niets is aan het veranderen tussen aanroepingen. Maar ik zie een sterk patroon van tijd - kleinere tijd - veel langere tijd.

Wat voor cache effecten, de functies rekenen op een 125 MB globale array, dus dat is niet van plan om nog past in mijn 6MB L3. (Ook al heb je zou verwachten dat de tweede en derde aanroepingen te snel zijn.)
Sponsored Links
  #2 (permalink)  
Old 09.08.2009
Geregistreerde gebruiker
 

Join Datum: oktober 2007
Locatie: Verenigde Staten
Posts: 759
Kun je post de code voor de functie foo.
  #3 (permalink)  
Old 09-09-2009
...@...
 

Join Date: Feb 2004
Locatie: NM
Berichten: 6.169

Code:
for (; i <= MAXN; i++)
		if ((*foo)(i)) n++;

Dat herhaalt MAXN die moet ten minste 50847534 - voor elk van de drie gesprekken met () de functie ptr time_loop is springen naar dezelfde functie. Tenzij die code heeft om dynamisch toewijzen geheugen of is er OS stelling voor sommige middelen, zou er niet zijn die verschillen.

Ik toevallig niet op de statische verklaring van functies, zoals voor een aantal redenen, behalve in bepaalde gevallen - maar dat is zeer waarschijnlijk niet de oorzaak van dit probleem.

U moet getrusage bellen () voor en na - zoals u nu doen met klok () om te zien wat er gebeurt in de wereld van de systeembronnen.

Ook klok () is net muur tijd, gebruik maken van de tijden () functie om systeem & gebruiker de tijd - zoals die wordt verbruikt door ouder en kind.

Ik denk dat Shamrock wil zien dat je niet belt exec of iets anders dat het systeem middelen eet of oorzaken hoge kernel keer misschien.
  #4 (permalink)  
Old 09-09-2009
fpmurphy's Avatar
Moderator
 

Join Date: december 2003
Locatie: Florida
Berichten: 2.101
Meer vragen. Wat voor soort systeem gebruikt u? Welke OS?
  #5 (permalink)  
Old 09-09-2009
Geregistreerde gebruiker
 

Join Datum: oktober 2007
Locatie: Verenigde Staten
Posts: 759
Het zou leuk zijn om te zien wat foo doet en je kunt gprof gebruiken voor profilering uw code om erachter te komen waarom sommige gesprekken zijn langer duurt.
  #6 (permalink)  
Old 09.10.2009
Geregistreerde gebruiker
 

Join Datum: maart 2009
Posts: 137
Niets grappig, net beetje manipulatie en toegang tot een grote array. De functies zijn allemaal gelijk en allemaal weer dezelfde resultaten, hier is een voorbeeld:

Code:
#define GET(b) ((sieve[(b)>>5]>>((b)&31))&1)
static int isprime3(int p) { return (p&1) ? p > 2 && !GET(p >> 1) : p == 2; }

Het systeem is 32-bits Xubuntu 8.10 op een quad-core Phenom II.

Zoals ik al eerder zei, zijn de resultaten consistent zijn. Als ik bel

Code:
	printf("New:     %f s\n", median3(&isprime3));
	printf("New:     %f s\n", median3(&isprime3));
	printf("New:     %f s\n", median3(&isprime3));

de tijd voor de eerste, vierde en zevende tijden zijn snel, zijn de tijden voor de derde, zesde en negende keer traag, enz.

---------- Post updated at 01:23 ---------- Vorige update was om 01:18 ----------

Citaat:
Oorspronkelijk geplaatst door jim McNamara View Post
Ik toevallig niet op de statische verklaring van functies, zoals voor een aantal redenen, behalve in bepaalde gevallen - maar dat is zeer waarschijnlijk niet de oorzaak van dit probleem.
Ik heb niet veel doen. Als u advies over betere manieren om dit te doen hebben, voel je vrij om uiteen te zetten (of geef een link!).
  #7 (permalink)  
Old 09.12.2009
...@...
 

Join Date: Feb 2004
Locatie: NM
Berichten: 6.169
Met betrekking tot statische functies:
Ik neem aan dat dit komt omdat de C99 standaard weinig over uitvoeringsprogramma van statische tekst, met uitzondering van wijzigingen in de consolidatiekring zegt --

In grote enkel bestand programma's met veel statische functies gemengd met automatische functies --
Ik heb echt encounteered obscure problemen in gcc 3.1, cc op HP UX 11.1. Bijvoorbeeld een automatische functie niet helemaal uitgevoerd. Klinkt vreemd, maar het is waar. Dezelfde "geërfd programma ontwerp" ook verpest door optimalisaties dwingt de compiler om besluiten was het niet verwacht te maken - volgens de HP compiler team te maken toch.

Principe het oplossen van de problemen die ik had om volledig uit te schakelen optimzation, en verklaren alle functies statisch juiste resultaten te krijgen. Aangezien een vaste makefile is een vereiste voor de gehele applicatie suite, betekende dit een grote herschrijven voor een aantal zeer grote programma's.

Uw probleem is niets zo. Het is bijna te cache-gerelateerde Gebaseerd op wat u hebt gezegd over je hardware, als je om je stuk 125MB van gegevens in 21 ~ 6MB brokken, dan iterate (1,2,3) over elke deelverzameling brok het probleem niet zou worden daar. Als het cache verband - en met geen andere opmerkingen te werken aan dat zou mijn gok.
Sponsored Links
Closed Thread

Bladwijzers

Thread Tools Zoeken in deze Thread
Zoeken in deze Thread:

Uitgebreid zoeken
Display Modes Beoordeel deze draad
Beoordeel deze draad:

Posting Regels
Jij mag niet Post Nieuwe threads
Jij mag niet na antwoorden
Jij mag niet post attachments
Jij mag niet bewerk uw berichten

BB code is Aan
Smilies zijn Aan
[IMG] code Aan
HTML-code is Uit
Trackbacks zijn Aan
Pingbacks zijn Aan
Refbacks zijn Uit


Meer UNIX en Linux Forum Onderwerpen Misschien vindt u Helpful
Draad Thread Starter Forum Antwoorden Last Post
byte-swapping 32-bit float en vreemd od resultaten GoDonkeys UNIX for Advanced & Expert Gebruikers 2 05-20-2009 08:54 PM
Hulp bij __builtin_prefetch functie en het is de timing Tavo Programmering 3 11-25-2008 05:31
de timing van uw taken bebop1111116 Programmering 3 11-01-2006 04:19 PM
Timing van een SSH rcunn87 Programmeren en Shell Scripting 9 07-31-2006 06:11 PM
scp een time-out JPH UNIX for Advanced & Expert Gebruikers 1 06-09-2005 11:59 PM



Alle tijden zijn GMT -4. Het is nu 10:23.


Powered by: vBulletin, Copyright © 2000 - 2006, Jelsoft Enterprises Limited. Vertalingen Powered by .
vBCredits v1.4 Copyright © 2007 - 2008, PixelFX Studios
De UNIX-en Linux Forums Copyright © 1993-2010. Alle rechten Reserved.Ad Beheer door RedTyger

Content Relevante URL's door vBSEO 3.2.0