Hlavní navigace

GLib: Stopky

29. 1. 2001
Doba čtení: 3 minuty

Sdílet

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:

ict ve školství 24

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ěší

Autor článku

Michal Burda vystudoval informatiku a aplikovanou matematiku a nyní pracuje na Ostravské univerzitě jako odborný asistent. Zajímá se o data mining, Javu a Linux.