Hlavní navigace

GLib: Stopky

Michal Burda

Po krátké odmlce se opět setkáváme u pravidelného seriálu pro programátory v jazyku C o knihovně GLib. Abychom po přestávce nezačínali něčím obtížnějším, čeká nás dnes trochu odpočinkové téma. Ukážeme si, jak měřit čas pomocí jednoduchých stopek knihovny GLib.

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, &micro));
  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ěší

Našli jste v článku chybu?
Vitalia.cz: Jmenuje se Janina a žije bez cukru

Jmenuje se Janina a žije bez cukru

Vitalia.cz: Taky věříte na pravidlo 5 sekund?

Taky věříte na pravidlo 5 sekund?

Podnikatel.cz: Změny v cestovních náhradách 2017

Změny v cestovních náhradách 2017

Podnikatel.cz: K EET. Štamgast už peníze na stole nenechá

K EET. Štamgast už peníze na stole nenechá

Lupa.cz: Kdo pochopí vtip, může jít do ČT vyvíjet weby

Kdo pochopí vtip, může jít do ČT vyvíjet weby

Lupa.cz: Insolvenční řízení kvůli cookies? Vítejte v ČR

Insolvenční řízení kvůli cookies? Vítejte v ČR

Lupa.cz: Teletext je „internetem hipsterů“

Teletext je „internetem hipsterů“

Měšec.cz: Zdravotní a sociální pojištění 2017: Připlatíte

Zdravotní a sociální pojištění 2017: Připlatíte

Měšec.cz: U levneELEKTRO.cz už reklamaci nevyřídíte

U levneELEKTRO.cz už reklamaci nevyřídíte

120na80.cz: Co všechno ovlivňuje ženskou plodnost?

Co všechno ovlivňuje ženskou plodnost?

Podnikatel.cz: Udávání kvůli EET začalo

Udávání kvůli EET začalo

120na80.cz: Na ucho teplý, nebo studený obklad?

Na ucho teplý, nebo studený obklad?

120na80.cz: Horní cesty dýchací. Zkuste fytofarmaka

Horní cesty dýchací. Zkuste fytofarmaka

Podnikatel.cz: Podnikatelům dorazí varování od BSA

Podnikatelům dorazí varování od BSA

Lupa.cz: Proč firmy málo chrání data? Chovají se logicky

Proč firmy málo chrání data? Chovají se logicky

Měšec.cz: Kdy vám stát dá na stěhování 50 000 Kč?

Kdy vám stát dá na stěhování 50 000 Kč?

Podnikatel.cz: Udávání a účtenková loterie, hloupá komedie

Udávání a účtenková loterie, hloupá komedie

Vitalia.cz: Proč vás každý zubař posílá na dentální hygienu

Proč vás každý zubař posílá na dentální hygienu

Měšec.cz: Jak levně odeslat balík přímo z domu?

Jak levně odeslat balík přímo z domu?

Root.cz: Certifikáty zadarmo jsou horší než za peníze?

Certifikáty zadarmo jsou horší než za peníze?