Kirjautuminen

Haku

Tehtävät

Keskustelu: Ohjelmointikysymykset: C++: Aikaa kaivataan

Koipio-ohjelma [08.07.2005 22:15:17]

#

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

Jaska [08.07.2005 23:32:37]

#

http://www.cplusplus.com/ref/ctime/time.html.

Koipio-ohjelma [08.07.2005 23:36:32]

#

Kiitos ja kumarrus. Sain tarvittavan tiedon, kiitos jaskan.

Metabolix [09.07.2005 08:53:06]

#

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);
}

thefox [13.07.2005 15:39:57]

#

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.

Vastaus

Aihe on jo aika vanha, joten et voi enää vastata siihen.

Tietoa sivustosta