Ho bisogno di sapere come posso calcolare il tempo di una funzione in codice C in nanosecondi. Ho provato a ripetere la funzione fino a consumare alcuni microsecondi. Ci sono altre funzioni in time.h
che possono essere utilizzate per calcolare il tempo in nanosecondi?Calcolo del tempo di funzionamento in nanosecondi nel codice C
risposta
Non si otterrà mai la precisione al nanosecondo. Pensa a quello che stai chiedendo: su una CPU da 1 GHz 1 nanosecondo è un ciclo di clock. Indipendentemente da ciò che tenti di chiamare, non otterrai mai quel tipo di precisione, è meglio attenersi ai microsecondi. Una domanda simile con molti esempi è qui: C++ Cross-Platform High-Resolution Timer.
Solo per c: su Windows si desidera utilizzare QueryPerformanceCounter. Ed ecco altro su QPC. Here è una domanda correlata su come utilizzare QueryPerformanceCounter.
timespec_get da C11 restituisce fino a nanosecondi, arrotondato alla risoluzione dell'implementazione. controlla http: // StackOverflow.it/a/36095783/2680660 – Efreeto
@efreet Non ho detto che non è possibile ottenere un valore di ritorno di nanosecondo, ho detto che non sarebbe accurato e quindi non più utile di un valore di ritorno in millisecondi. – chacham15
A prescindere da come ci si avvicina a questo o da quale tipo di sistema/sistema operativo si sta utilizzando, si ottiene una risposta approssimativa al meglio, con una considerevole varianza dovuta alla natura del problema.
In secondo luogo, è necessario un sistema che supporti questo tipo di chiamata. È abbastanza facile se si sta utilizzando QNX Neutrino:
http://www.qnx.com/developers/docs/6.3.0SP3/neutrino/lib_ref/c/clock_gettime.html
/*
* This program calculates the time required to
* execute the program specified as its first argument.
* The time is printed in seconds, on standard out.
*/
#include <stdio.h>
#include <unistd.h>
#include <stdlib.h>
#include <time.h>
#define BILLION 1000000000L;
int main(int argc, char** argv)
{
struct timespec start, stop;
double accum;
if(clock_gettime(CLOCK_REALTIME, &start) == -1) {
perror("clock gettime");
return EXIT_FAILURE;
}
system(argv[1]);
if(clock_gettime(CLOCK_REALTIME, &stop) == -1) {
perror("clock gettime");
return EXIT_FAILURE;
}
accum = (stop.tv_sec - start.tv_sec)
+ (double)(stop.tv_nsec - start.tv_nsec)
/(double)BILLION;
printf("%lf\n", accum);
return EXIT_SUCCESS;
}
La funzione clock
in serie C non è utile per questo. Di solito ha una risoluzione orribile ed è incoerente (tra piattaforme) se misura il tempo di parete trascorso o il tempo di CPU consumato. È necessario utilizzare la funzione standard POSIX clock_gettime
(che ha una risoluzione di nanosecondi e consente di specificare l'orologio da misurare) ed emularlo con qualsiasi operazione di clock specifica del sistema disponibile su piattaforme prive della funzione POSIX.
nota: c'è una differenza tra "risoluzione del nanosecondo" e "accuratezza al nanosecondo". inoltre, vuole una soluzione Windows, che non è questa (scusa, l'ha menzionata in un commento, ho appena aggiunto il tag). – chacham15
Chiamare la funzione abbastanza volte per ottenere il tempo totale nei secondi e utilizzare qualsiasi metodo per misurare (anche semplice orologio C()). Misurare in micro/nanosecondi è intrinsecamente troppo impreciso.
Per il benchmarking, si desidera QueryPerformanceCounter. È il miglior cronometro disponibile su Windows. Vedi: How to use QueryPerformanceCounter? Tuttavia usando questo per misurare (per esempio) una singola chiamata di funzione sarà ancora intrinsecamente molto imprecisa; Penso che tu abbia bisogno di tempo sull'ordine di un secondo totale per ottenere un buon rapporto segnale-rumore per le tue misurazioni. Prendi più misure di qualunque durata tu voglia e confronta il loro valore con la loro deviazione standard per assicurarti di misurare con sufficiente accuratezza.
Multimedia Timers sono probabilmente il miglior orologio (notare la differenza tra orologio e cronometro: uno misura il tempo assoluto, solo gli altri intervalli di tempo) disponibile su Windows. Dovresti essere in grado di ottenere una risoluzione e precisione quasi al millisecondo con timeGetTime().
- 1. Calcolo del tempo con il codice C++
- 2. Calcolo del tempo futuro in C#
- 3. Ottimizzazione del tempo di funzionamento dell'algoritmo
- 4. Tempo di funzionamento variabile di un programma C
- 5. Come eseguire il calcolo del codice di tempo?
- 6. Calcolo del tempo trascorso in un programma C in millisecondi
- 7. Funzionamento del codice hot swapping
- 8. Calcolo del costo di funzionamento/cumulativo dell'istanza di spot EC2
- 9. Linting in tempo reale del codice C
- 10. Ottieni tempo POSIX/Unix in secondi e nanosecondi in Python?
- 11. C# Dimensioni del codice e tempo di esecuzione del codice
- 12. Calcolo del valore di maxstack nel codice IL
- 13. Calcolo della complessità del tempo
- 14. Tempo di calcolo! =
- 15. Misurazione del tempo di esecuzione in C++ Codice OpenMP
- 16. JMeter - calcolo del tempo di risposta
- 17. Tempo trascorso calcolo
- 18. Calcolo del Totale secondi da un particolare formato di tempo
- 19. Ricottura simulata in R: tempo di funzionamento GenSA
- 20. Calcolo del punto sulla circonferenza del cerchio dall'angolo in C#?
- 21. Calcolo del tempo tra due clic in Javascript
- 22. Razione di errore nella cache e calcolo del tempo medio
- 23. C++ crono tempo di sistema in millisecondi, operazioni di tempo
- 24. Problema con funzionamento in virgola mobile di precisione in C
- 25. Analisi di stringhe datetime contenenti nanosecondi
- 26. Riflessione del tempo di compilazione in C#
- 27. misurazione esatta del tempo
- 28. Uno strumento per il calcolo della complessità del tempo grande del codice Java?
- 29. Tempo di esecuzione codice misura C (Linux)
- 30. Calcolo del volume per sfera in C++
L'accuratezza del nanosecondo è, nella migliore delle ipotesi, altamente dipendente dalla piattaforma. Quale piattaforma - Windows/Linux/qualcosa di incorporato? –
No, e misurare una singola chiamata di funzione non è comunque molto utile. Potresti usare clock() però. – Cubic
Se si utilizza Linux, Linux non è una piattaforma in tempo reale. e la sua scala di pianificazione è in millisecondi. – MOHAMED