Získání systému tick počítat se základní C ++?

hlasů
9

Já v podstatě chtějí rekonstruovat funkci GetTickCount () okna, tak jsem ji použít v základním C ++ bez standardních knihoven nejsou nebo dokonce STK. (Tak to je v souladu s knihovnami dodávané s Android NDK)

Jsem se podíval na

hodiny()

místní čas

čas

Ale já jsem stále nejste jisti, zda je možné replikovat Windows funkci GetTickCount s časovým knihovně.

Může mi někdo místo mě správným směrem, jak to udělat, nebo jestli jeho možné?

Přehled o tom, co chci dělat:

Chci, aby bylo možné vypočítat, jak dlouho byla žádost o „dělání“ určitou funkci.

Tak například chci, aby bylo možné vypočítat, jak dlouho byla žádost pokusu zaregistrovat se serverem

Snažím se portu něj z okna běžet na Linuxu založený Android, zde je windows kód:


int TimeoutTimer::GetSpentTime() const
{
if (m_On)
{
    if (m_Freq>1)
    {
        unsigned int now;
        QueryPerformanceCounter((int*)&now);
        return (int)((1000*(now-m_Start))/m_Freq);
    }
    else
    {
        return (GetTickCount()-(int)m_Start);
    }
}
return -1;
}
Položena 29/04/2010 v 16:41
zdroj uživatelem
V jiných jazycích...                            


5 odpovědí

hlasů
18

Android NDK můžete použít POSIX clock_gettime () volání, které je součástí libc. Tato funkce je místo, kde různé Android časovače volání skončí.

Například java.lang.System.nanoTime () je vytvořen s:

struct timespec now;
clock_gettime(CLOCK_MONOTONIC, &now);
return (u8)now.tv_sec*1000000000LL + now.tv_nsec;

Tento příklad používá monotónní hodiny, což je to, co chcete při výpočtu doby trvání. Na rozdíl od nástěnné hodiny (k dispozici přes gettimeofday ()), nebude to přeskočit vpřed nebo vzad při hodiny Přístroj změnila poskytovatelem sítě.

Ten muž strana Linux pro clock_gettime () popisuje další hodiny, které mohou být k dispozici, například uplynulý čas CPU per-nit.

Odpovězeno 30/04/2010 v 21:23
zdroj uživatelem

hlasů
9

clock()funguje velmi podobně jako Windows je GetTickCount(). Tyto jednotky mohou být odlišná. GetTickCount()vrátí milisekund. clock()vrací CLOCKS_PER_SECklíšťata za sekundu. Oba mají max který bude přetáčení (pro Windows, která je asi 49,7 dnů).

GetTickCount()začíná na nule při spuštění operačního systému. Z dokumentů, vypadá to, že clock()začne-li se tímto způsobem. Takto si můžete porovnat časy mezi procesy se GetTickCount(), ale asi nemůže dělat, že se clock().

Pokud se snažíte vypočítat, jak dlouho se něco děje, v rámci jediného procesu, a nejste starosti převrácení:

const clock_t start = clock();
// do stuff here
clock_t now = clock();
clock_t delta = now - start;
double seconds_elapsed = static_cast<double>(delta) / CLOCKS_PER_SEC;

Upřesnění: Zdá se, že nejistota v tom, zda clock()se vrátí uplynulý čas na zeď nebo čas procesoru. Prvních několik odkazů Ověřil jsem si říci čas zeď. Například:

Vrací počet hodin klíšťata, která uplynula od jeho zahájení.

které sice je trochu vágní. MSDN je jasněji:

Uplynulý čas zeď hodiny od začátku procesu ....

Uživatel Darron mě přesvědčil, abych hlouběji, takže jsem našel návrh kopii standardu C (ISO / IEC 9899: TC2), a říká:

... vrátí nejtěsnější přiblížení provádění, aby na čas procesoru použitého ...

Věřím, že každá implementace jsem kdy použil dává čas na zeď hodiny (což, jak předpokládám, je přiblížení k času procesoru použitého).

Závěr: Pokud se snažíte, aby čas, takže kód, takže můžete srovnávacích různé optimalizace, pak moje odpověď je to vhodné. Pokud se snažíte zavést časový limit založený na skutečném čase na zeď s hodinami, pak budete muset zkontrolovat místní realizaci clock()nebo použít jinou funkci, která je popsána dát uplynulý čas na zeď hodiny.

Aktualizace: S C ++ 11, je zde také část standardní knihovny, který poskytuje řadu hodin a typů pro zachycení doby a doby trvání. Zatímco standardizované a široce dostupné, to není jasné, zda Android NDK ještě plně podporuje.

Odpovězeno 29/04/2010 v 17:20
zdroj uživatelem

hlasů
3

Je to platforma závislá, takže stačí napsat wrapper a realizovat specifika pro každou platformu.

Odpovězeno 29/04/2010 v 16:50
zdroj uživatelem

hlasů
1

Máte přístup k funkci vblank přerušení (nebo hblank) na Androidu? Pokud tomu tak je, zvýšit globální, těkavé var tam časovač.

Odpovězeno 29/04/2010 v 16:45
zdroj uživatelem

hlasů
1

Není to možné. C ++ standard a jako důsledek standardní knihovny, nevědí nic o zpracovateli nebo ‚klíšťata‘. To může nebo nemusí měnit v C ++ 0x s podporou závitů, ale alespoň pro tuto chvíli, že to není možné.

Odpovězeno 29/04/2010 v 16:44
zdroj uživatelem

Cookies help us deliver our services. By using our services, you agree to our use of cookies. Learn more