Budete-li někdy potřebovat změřit, jak dlouho trvalo provedení části programu, můžete sáhnout po jednoduchém mechanizmu knihovny GLib – stopkách ( GTimer
). GTimer
slouží výhradně k měření časových intervalů – systémový čas pomocí něj nezjistíte. GTimer
lze spustit, zastavit, odečíst naměřený čas a vynulovat. Klasika.
Objekt (v řeči std. céčka vždy pouze struktura) stopky je reprezentován datovým typem GTimer
:
struct GTimer;
Celá struktura je neveřejná a pracovat by se s ní mělo jen pomocí speciálních funkcí, které si nyní popíšeme.
GTimer* g_timer_new(void);
…vytvoří (alokuje) novou strukturu GTimer
a vrátí ukazatel na ni. Nový GTimer
se automaticky spustí, takže můžete měřit čas rovnou od jeho vzniku. Po ukončení práce s GTimer
em zavolejte vždy funkci
void g_timer_destroy(GTimer *timer);
…která alokovaný prostor pro timer
uvolní.
void g_timer_start(GTimer *timer);
…spustí stopky timer
. Čas se měří vždy znovu od 0, takže není nutno GTimer
nulovat ručně.
void g_timer_stop(GTimer *timer);
…zastaví měření času timer
em.
gdouble g_timer_elapsed(GTimer *timer, gulong *microseconds);
…funkce vrátí velikost uplynulého intervalu v sekundách jako hodnotu double. timer
je pointer na GTimer
, kterým se provádí měření. Pokud je parametr microseconds
různý od NULL, uloží se do něj počet mikrosekund od poslední celé sekundy. Funkce standardně vrací velikost intervalu mezi spuštěním a zastavením stopek. Zjištění uplynulého času lze ale provádět i „za chodu“, tzn. před čtením času není nutno GTimer
zastavovat; pak se bere v úvahu časový interval od spuštění stopek po okamžik volání této funkce.
void g_timer_reset(GTimer *timer);
Nastaví uplynulý čas stopek timer
na nulu. Nulování lze provádět i za chodu stopek.
To je o funkcích určených pro práci s GTimer
em vše. Vnitřně stopky fungují asi takto: při vytvoření, spuštění nebo nulování GTimer
u se uloží aktuální čas systému jako „počáteční“ a při zastavení stopek jako „koncový“. Přitom se ve struktuře GTimer
uchovává ještě stavová hodnota „aktivní“, která určuje, jestli stopky běží, nebo ne. Při volání funkce g_timer_elapsed()
se podle stavu „aktivní“ vypočítává rozdíl mezi „počátečním“ a „koncovým“ časem (aktivní = FALSE) nebo „počátečním“ a aktuálním časem (aktivní = TRUE). Jednoduché ale účinné, že?
Příklad:
#include <glib.h>
gint main(void) { GTimer *timer; gint i, j; gulong micro = 0; /* vytvoreni novych stopek (cas se zacina merit) */ timer = g_timer_new(); for (i = 0; i < 10; i++) { for (j = 0; j < 1000000; j++) printf(""); /* nejaka narocna operace :-) */ printf("Prozatim uplynulo %lf sekund.\n", g_timer_elapsed(timer, NULL)); } /* zastaveni stopek */ g_timer_stop(timer); printf("Akce trvala %lf sekund.\n", g_timer_elapsed(timer, µ)); printf("(%lu mikrosekund po cele sekunde.)\n", micro); g_timer_destroy(timer); }
Výstupem naší malé ukázky by mohlo být něco jako:
Prozatim uplynulo 0.434005 sekund. Prozatim uplynulo 0.882085 sekund. Prozatim uplynulo 1.316585 sekund. Prozatim uplynulo 1.763640 sekund. Prozatim uplynulo 2.200814 sekund. Prozatim uplynulo 2.635397 sekund. Prozatim uplynulo 3.082924 sekund. Prozatim uplynulo 3.531932 sekund. Prozatim uplynulo 4.010983 sekund. Prozatim uplynulo 4.446698 sekund. Akce trvala 4.449034 sekund. (449034 mikrosekund po cele sekunde.)
Na posledním řádku vidíme v akci i parametr microseconds
funkce g_timer_elapsed()
. Jeho hodnota není nic jiného než desetinná část počtu sekund vynásobena miliónem (mikro-).
A to je pro dnešek vše. U dalšího pokračování se těší