Ufo otsikko :D
No, kuitenkin, voisiko joku kertoa, onko C++ kirjastoissa mitään funktiota, joka palauttaisi kyseisellä hetkellä olevan ajan(niin pienellä tarkkuudella kuin mahdollista).
Kiitos kaikille, jotka vaivautuvat auttamaan :D
Kiitos ja kumarrus. Sain tarvittavan tiedon, kiitos jaskan.
Mutta jos on kyse ajan mittaamisesta, niin parempaankin pystytään, vaikka päädytäänkin jo käyttöjärjestelmäriippuvaiseen koodiin. (En tietenkään muuten valmiita funktioita laittaisi, mutta kun kerran ovat varastossa...)
/* Windows-versio. Palauttaa edellisestä kutsusta kuluneen ajan millisekunteina mahdolisuuksien mukaan hyvinkin tarkasti. (Multimedia Timer voisi periaatteessa pystyä vielä tarkempaan, en tiedä.) */ #undef _WIN32_LEAN_AND_MEAN #include <windows.h> /* Linkitetään Winmm.lib */ typedef unsigned long DWORD; DWORD KulunutAika() { static DWORD Uusi, Vanha, Res; Vanha = Uusi; // Jos ei ole testattu resoluutiota, testataan nyt if (!Res) { for (Res = 1; Res < 1000; Res++) { if (timeBeginPeriod(Res) == TIMERR_NOERROR) { Vanha = timeGetTime(); timeEndPeriod(Res); break; } timeEndPeriod(Res); } } // Haetaan aika, jos ei tule virhettä. if (timeBeginPeriod(Res) == TIMERR_NOERROR) { while (Vanha == timeGetTime()); Uusi = timeGetTime(); } else Uusi = Vanha; timeEndPeriod(Res); // Palautetaan (Uusi - Vanha) return (Uusi - Vanha); }
/* Monessa Linux-/Unix-pohjaisessa toimiva ratkaisu. Kuten näkyy, näillä olisi varaa molemmilla mikrosekunteihin ja toisella peräti nanosekunteihin (vaikka harva kone niitä varmaan oikeasti pystyy laskemaan). */ #include <sys/time.h> typedef unsigned long DWORD; DWORD GetTime() { static DWORD Uusi, Vanha, Res; Vanha = Uusi; #ifdef HAVE_CLOCK_GETTIME struct timespec tp; while (Uusi == Vanha) { clock_gettime(CLOCK_REALTIME, &tp); Uusi = (tp.tv_sec * 1000) + (tp.tv_nsec / 1000000); } #else struct timeval tp; while (Uusi == Vanha) { gettimeofday(&tp, NULL); Uusi = (tp.tv_sec * 1000) + (tp.tv_usec / 1000); } #endif /* Ei ensimmäisellä kerralla mitään ihmeaikoja. Tämän voi toki poistaa. */ if (!Res) { Res = 1; Vanha = Uusi - 1; } // Palautetaan (Uusi - Vanha) return (Uusi - Vanha); }
Tarkkaa ajastusta saa Windowsissa QueryPerformanceCounter ja QueryPerformanceFrequency -funktioiden avulla. Funktiot käyttävät useimmiten Pentium-koneista löytyvää "rdtsc"-käskyä. x86-linsuxeissa (Pentium tai uudempi) tuota voi käyttää esimerkiksi inline-assemblyn keinoin.
Aihe on jo aika vanha, joten et voi enää vastata siihen.