Finns det något smidigt sätt i C att få fram en timestamp i millisekunder? Jag är egentligen endast intresserad av endast millisekunder, datum osv skiter jag i
Har sökt och letat lite här och var, bland annat på google, men de flesta lösningarna verkar gälla C++ och det har jag inte möjlighet att använda.
Hittade ett exempel här, men det sträcker sig bara till sekunder vilket är alldeles för stort för mig...
#include <stdio.h>
#include <time.h>
void timestamp(FILE *out)
{
struct tm *tmp;
time_t t;
t = time(NULL);
tmp = localtime(&t); /* or gmtime, if you want GMT^H^H^HUTC */
fprintf(out, "%02d.%02d.%04d %02d:%02d:%02d",
tmp->tm_mday, tmp->tm_mon+1, tmp->tm_year+1900,
tmp->tm_hour, tmp->tm_min, tmp->tm_sec);
}
/* example of how to call this function: */
int main()
{
printf("The current date and time are: ");
timestamp(stdout);
printf("\n");
return 0;
}
syntax high
Jag tror inte att du kan få rätvisande millisekunder i Windows som operativ.
Då måste du köra RTOS av något slag.
Att mäta millisekunder på detta vis är inget problem, eftersom denna data plockas från ett separat dedikerat timer-chip. Det du antagligen tänker på är att man behöver ett RTOS för att en server med större sannolikhet ska svara inom millisekunder.
Jag tror inte att du kan få rätvisande millisekunder i Windows som operativ.
Vanliga API-funktioner (såsom GetTickCount() etc.) har om jag minns rätt inte riktigt upplösning ner till millisekunder, men du kan alltid använda QueryPerformanceCounter() eller assemblerinstruktionen rdtsc så erhålls upplösning i storleksordning av processorns klockfrekvens (nanosekunder).
Sangdrax, hur verkar min lösning i övrigt? Är den nått sånt där tillförlitlig när det gäller timestamps i millisekunder? Ansi C (ren C) är det jag kompilerar för.
Nu är det ju inte den funktionen du använder, utan du använder dig av datorns klocka. Dock tar ditt anrop till ftime() troligtvis avsevärt längre tid än GetTickCount, så vem vet? rdtsc är både jättesnabb att anropa och mycket exakt.
Bättre svar oavsett metod får du om du gör samma test massor av gånger och bildar medelvärdet.
inline unsigned long int rdtsc32()
{
unsigned long int lowPart;
__asm
{
pushad
cpuid
rdtsc
mov lowPart, eax
popad
}
return lowPart;
}
Sang-drax, förstår inte hur jag ska få koden ovan att göra något liknande det jag gör i min urpsrungliga lösningen. Fungerar verkligen den kod i ren C (ej C++ eller liknande)? Om du vet hur denna skulle se ut så får du gärna visat.
Har mätt lite med min funktion på samma tasks och jag har fått diffar på ungefär 11 millisekunder, men det kan ju bero på att CPU:n belastas olika när jag gör testerna.
Niklas, ett tips är att köra cpuid innan rdtsc så att processorn tömmer sin "kö" och verkligen kör instruktionerna som kommer efter rdtsc efter och inte före.
Kanonbra, tack för svaret Niklas och hjälpen Sang-drax. Har en annan lösning som ska vara väldigt bra men som jag ej ännu hunnit sätta mig in i. Blir eventuellt ikväll, återkommer om detta.
Den lösningen som jag postade i inlägg nummer #5 visade sig inte vara bra när jag använde den i praktiken, dvs det system som den är ämnad för. Min uträkningar visade ibland rätt resultat och ibland fel, vilket visade sig vara på grund av den icke-tillförlitliga "ftime".
273 ms totalt · 4 externa anrop · v20260731065814-full.d34c6d5a