Domanda

In questo momento sto caricando un file quindi utilizzando gettimeofday e il monitoraggio del tempo di CPU con tv_usec

I miei risultati varia, ottengo 250 di a 280s, ma a volte 300 o 500 del di. Ho scritto usleep e dormire (0) e (1) senza successo. Il tempo varia ancora notevolmente. Ho pensato che il sonno (1) (secondi in linux, non il sonno finestre in ms) avrebbe risolto. Come posso tenere traccia del tempo in modo più coerente per il test? Forse dovrei aspettare fino a quando ho un dati di test molto più grande e più complesso il codice prima di iniziare le misurazioni?

È stato utile?

Soluzione

L'interfaccia attualmente raccomandato per il tempo ad alta rez su Linux (e POSIX in generale) è clock_gettime. Vedere la pagina man.


clock_gettime(CLOCK_REALTIME, struct timespec *tp) //  for wall-clock time
clock_gettime(CLOCK_PROCESS_CPUTIME_ID, struct timespec *tp) //  for CPU time

Ma leggere la pagina man. Si noti che è necessario collegare con -lrt, perché POSIX dice così, immagino. Forse per evitare conflitti di simbolo in -lc, per i vecchi programmi che hanno definito la propria clock_gettime? Ma librerie dinamiche utilizzano simboli deboli ...

La funzione di sonno migliore è nanosleep. E non scherza con i segnali o qualsiasi stronzate come usleep. Essa è definita per dormire, e non hanno altri effetti collaterali. E ti dice se sono svegliato presto (per esempio dai segnali), in modo da non devono necessariamente chiamare un'altra funzione del tempo.

In ogni caso, si sta andando ad avere un tempo difficile testare una ripetizione di qualcosa che a breve che coinvolge una chiamata di sistema. C'è una quantità enorme di opportunità per la variazione. per esempio. lo scheduler può decidere che alcune altre esigenze di lavoro facendo (improbabile, se il processo appena iniziato, non sarà necessario utilizzare il vostro timeslice ancora). CPU cache (L2 e TLB) sono facilmente possibile.

Se si dispone di una macchina multi-core e un punto di riferimento a thread singolo per il codice che state ottimizzando, si può dare la priorità in tempo reale appuntato ad una delle vostre anime. Assicurati di aver scelto il nucleo che non gestisce gli interrupt, o la tastiera (e tutto il resto) saranno bloccato finché non è finito. Utilizzare taskset (per appuntare per una CPU) e CHRT (per la regolazione in tempo reale prio). Vedere questa mail che ho inviato a gmp-devel con questo trucco: http://gmplib.org/list-archives/gmp- devel / 2008-marzo / 000789.html

Oh sì, per i tempi più precisi, è possibile utilizzare rdtsc da soli (su x86 / amd64). Se non si dispone di altre chiamate di sistema in quello che stai tenere in panchina, non è una cattiva idea. Afferra un quadro di analisi comparativa per mettere la funzione in. GMP ha un uno abbastanza decente. Non è forse impostato bene per le funzioni che non sono in GMP di benchmarking e chiamò mpn_whatever, però. Non mi ricordo, e vale la pena dare un'occhiata.

Altri suggerimenti

Si sta tentando di misurare quanto tempo ci vuole per caricare un file? Di solito, se sei prestazioni testare alcune po 'di codice che è già piuttosto veloce (inferiore al secondo), poi si vuole ripetere lo stesso codice di un certo numero di volte (diciamo mille o un milione), il tempo l'intero lotto, quindi dividere il tempo totale per il numero di iterazioni.

Detto questo, io non sono molto sicuro di quello che si sta utilizzando sleep () per. Puoi pubblicare un esempio di ciò che si intende fare?

mi sento di raccomandare di mettere quel codice in un ciclo for. Eseguirlo più di 1000 o 10000 iterazioni. C'è problemi con questo se si sta facendo solo alcune istruzioni, ma dovrebbe aiutare.

set di dati più grandi anche aiuto naturalmente.

il sonno sta per deschedule tuo thread dalla CPU. Non conta con precisione il tempo con precisione.

Autorizzato sotto: CC-BY-SA insieme a attribuzione
Non affiliato a StackOverflow
scroll top