|
|
|
|
Google Site
|
|||||||
| Forums | Registreer | Blog | Man Pages | Forum Regels | Links | Albums | Veelgestelde vragen | Gebruikers | Kalender | Zoeken | Today's Posts | Markeer forums als gelezen |
| Programmering Post vragen over C, C + +, Java, SQL, en andere programmeertalen hier. |
![]() |
|
|
Thread Tools | Zoeken in deze Thread | Rate Thread | Display Modes |
|
|||
|
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 |
|
|
|
|||
|
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. |
|
|||
|
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:
|
|
|||
|
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 | ||
|
|
![]() |
| Bladwijzers |
| Thread Tools | Zoeken in deze Thread |
| Display Modes | Beoordeel deze draad |
|
|
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 |