Domanda

Ho bisogno di un modo molto preciso per cronometrare parti del mio programma. Potrei usare il normale orologio ad alta risoluzione per questo, ma ciò restituirà il tempo di wallclock, che non è quello di cui ho bisogno: ho bisogno del tempo impiegato per eseguire solo il mio processo.

Ricordo distintamente di aver visto una patch del kernel Linux che mi avrebbe permesso di temporizzare i miei processi con un'accuratezza dei nanosecondi, tranne che ho dimenticato di aggiungerlo ai segnalibri e ho dimenticato anche il nome della patch :(.

Ricordo come funziona però:

Su ogni interruttore di contesto, leggerà il valore di un clock ad alta risoluzione e aggiungerà il delta degli ultimi due valori al tempo di processo del processo in esecuzione. Ciò produce una visione accurata ad alta risoluzione del "tempo di processo effettivo" del processo.

Il normale tempo di processo viene mantenuto utilizzando l'orologio normale, che credo sia millisecondo preciso (1000Hz), che è troppo grande per i miei scopi.

Qualcuno sa di quale patch del kernel sto parlando? Ricordo anche che era come una parola con una lettera prima o dopo - qualcosa come "rtimer" o qualcosa del genere, ma non ricordo esattamente.

(Anche altri suggerimenti sono i benvenuti)


Lo Scheduler completamente equo suggerito da Marko non è quello che stavo cercando, ma sembra promettente. Il problema che ho è che le chiamate che posso usare per ottenere il tempo di processo non stanno ancora restituendo valori sufficientemente granulari.

  • times () restituisce i valori 21, 22, in millisecondi.
  • clock () restituisce valori 21000, 22000, stessa granularità.
  • getrusage () sta restituendo valori come 210002, 22001 (e simili), sembrano avere una precisione un po 'migliore ma i valori sembrano evidentemente uguali.

Quindi ora il problema che probabilmente ho riscontrato è che il kernel ha le informazioni di cui ho bisogno, semplicemente non conosco la chiamata di sistema che lo restituirà.

È stato utile?

Soluzione

Se stai cercando questo livello di risoluzione temporale, probabilmente stai provando a fare qualche micro-ottimizzazione. In tal caso, dovresti consultare PAPI . Non solo fornisce sia informazioni sul cronometraggio a parete sia virtuali (solo di processo), ma fornisce anche accesso ai contatori di eventi della CPU, che possono essere indispensabili quando si cerca di migliorare le prestazioni.

http://icl.cs.utk.edu/papi/

Altri suggerimenti

Vedi questa domanda per ulteriori informazioni .

Qualcosa che ho usato per queste cose è gettimeofday (). Fornisce una struttura con secondi e microsecondi. Chiamalo prima del codice e di nuovo dopo. Quindi sottrai le due strutture usando timersub e puoi ottenere il tempo impiegato in secondi dal campo tv_usec.

Se hai bisogno di unità di tempo molto piccole per testare (presumo) la velocità del tuo software, consiglierei di far girare le parti che vuoi cronometrare in un ciclo milioni di volte, prendere il tempo prima e dopo il ciclo e calcola la media. Un buon effetto collaterale nel fare questo (oltre a non aver bisogno di capire come usare i nanosecondi) è che otterresti risultati più coerenti perché il sovraccarico casuale causato dallo sceduler os sarà calcolato in media.

Ovviamente, a meno che il tuo programma non debba essere in grado di funzionare milioni di volte in un secondo, è probabilmente abbastanza veloce se non riesci a misurare un tempo di esecuzione di millisecondi.

Credo che CFC ( Scheduler completamente equo ) è ciò che stai cercando.

È possibile utilizzare il Timer eventi ad alta precisione ( HPET ) se si dispone di un abbastanza recente 2.6 kernel. Scopri Documentation / hpet.txt su come usarlo. Questa soluzione dipende dalla piattaforma e credo che sia disponibile solo sui nuovi sistemi x86. HPET ha almeno un timer da 10 MHz, quindi dovrebbe adattarsi facilmente alle tue esigenze.

Credo che diverse implementazioni PowerPC di Freescale supportino anche un contatore di istruzioni esatte per il ciclo. L'ho usato diversi anni fa per profilare un codice altamente ottimizzato, ma non ricordo come si chiama. Credo che Freescale abbia una patch del kernel che devi applicare per accedervi dallo spazio utente.

http://allmybrain.com/2008/ / 06/10-temporizzazione cc-codice-on-linux /

potrebbe esserti di aiuto (direttamente se lo stai facendo in C / C ++, ma spero che ti dia dei suggerimenti anche se non lo sei) ... Afferma di fornire un'accuratezza dei microsecondi, che supera criterio. :)

Penso di aver trovato la patch del kernel che stavo cercando. Pubblicandolo qui, quindi non dimentico il link:

http://user.it.uu.se/~mikpe/ linux / PERFCTR / http://sourceforge.net/projects/perfctr/

Modifica: funziona per i miei scopi, anche se non è molto intuitivo.

provare il del timestamp della CPU ? Wikipedia sembra suggerire di usare clock_gettime ().

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