Avatar
Libor Šimo (libcosenior):

Ahoj.
Nedarí sa mi opakovane použiť premennú typu clock_t.
Príklad:

int main(void)
{
   int i;
   clock_t start, stop;

   for (i = 0; i < 10; i++) {
      start = clock();
      ...
      priebeh časti programu
      ...
      stop = clock();
      printf("Beh casti programu trval %.3f sekund",
          (float)((stop - start) / (float)CLOCKS_PER_SEC));
   }

   return 0;
}

Na nete som našiel, že sa dá použiť:
start = clock() - start;
stop = clock() - stop;
ale to nepomáha.
Inde som našiel, že pri opakovanom použití je potrebné vždy použiť novú premennú.

Kde je pravda?
Ako to riešiť?
Stačí malý nástrel. :-)

Odpovědět 11.4.2014 9:37
Aj tisícmíľová cesta musí začať jednoduchým krokom.
Avatar
Odpovídá na Libor Šimo (libcosenior)
Barevný Klaun:

Sice nevím jak na to, ale můžu se tě zeptat?
Co z toho bude až to bude?

 
Nahoru Odpovědět 11.4.2014 10:02
Avatar
Libor Šimo (libcosenior):

Je to len test trvania behu časti nejakého programu.
Keď je to bez cyklu a spustím test viacej krát, výsledky sú rozdielne.
Ide o to urobiť viac testov v cykle a výsledok spriemerovať.
Slúžiť by to malo k tomu, aby som pri optimalizácii kódu dospel k väčšej rýchlosti programu.

Nahoru Odpovědět  +1 11.4.2014 10:16
Aj tisícmíľová cesta musí začať jednoduchým krokom.
Avatar
Odpovídá na Barevný Klaun
Libor Šimo (libcosenior):

Zabudol som kliknúť na odpoveď, sorry.

Nahoru Odpovědět 11.4.2014 10:37
Aj tisícmíľová cesta musí začať jednoduchým krokom.
Avatar
Odpovídá na Libor Šimo (libcosenior)
Barevný Klaun:

To nevadí. Já si to přečetl :P
Takže to je třeba pro hru?

Editováno 11.4.2014 10:41
 
Nahoru Odpovědět 11.4.2014 10:39
Avatar
Odpovídá na Barevný Klaun
Libor Šimo (libcosenior):

Pre akýkoľvek program.

Editováno 11.4.2014 10:56
Nahoru Odpovědět 11.4.2014 10:55
Aj tisícmíľová cesta musí začať jednoduchým krokom.
Avatar
coells
Redaktor
Avatar
Odpovídá na Libor Šimo (libcosenior)
coells:

clock() měří procesorový čas využitý procesem, takže jestli tam máš nanosleep() nebo děláš I/O operace, nebude to měřit to, co chceš.

printf("Beh casti programu trval %.3g sekund", (float)(e - s) / CLOCKS_PER_SEC);
 
Nahoru Odpovědět 11.4.2014 12:35
Avatar
Odpovídá na coells
Luboš Běhounek (Satik):

Často se (na win) na přesné měření času používá winapi funkce QueryPerforman­ceCounter() .

(to měla být spíš odpověď na Libor Šimo (libcosenior) )

Editováno 11.4.2014 12:44
Nahoru Odpovědět 11.4.2014 12:44
:)
Avatar
coells
Redaktor
Avatar
 
Nahoru Odpovědět 11.4.2014 12:44
Avatar
Odpovídá na coells
Libor Šimo (libcosenior):

Napríklad takto:

#include <stdio.h>
#include <stdlib.h>
#include <time.h>
#define MNOZSTVO 100000000
#define ROZSAH 100

int main(void)
{
    long i;
    long *pole_nahodnych_cisiel;

    if ((pole_nahodnych_cisiel = (long * ) malloc(MNOZSTVO * sizeof(long))) == NULL) {
        printf("Malo pamati!");
        return 1;
    }

    srand(time(0));

    clock_t start = clock();
    i = 0;
    while (i < MNOZSTVO)
        pole_nahodnych_cisiel[i++] = rand()%ROZSAH;
    clock_t stop = clock();
    printf("Trvanie bolo %.3f secund.\n", (float)(stop - start) / CLOCKS_PER_SEC);
    free(pole_nahodnych_cisiel);

    return 0;
}
Editováno 11.4.2014 13:04
Nahoru Odpovědět 11.4.2014 13:01
Aj tisícmíľová cesta musí začať jednoduchým krokom.
Avatar
Odpovídá na Luboš Běhounek (Satik)
Libor Šimo (libcosenior):

Tá funkcia je pre c++ a ja to používam v céčku.

Nahoru Odpovědět 11.4.2014 13:02
Aj tisícmíľová cesta musí začať jednoduchým krokom.
Avatar
Libor Šimo (libcosenior):

Nakoniec som dospel k záveru, že nie je potrebné opakované meranie, pretože sú tam naozaj len minimálne rozdiely. Ak sa podarí zefektívniť kód, ten rozdiel času je dosť viditeľný.

Nahoru Odpovědět 11.4.2014 13:07
Aj tisícmíľová cesta musí začať jednoduchým krokom.
Avatar
Odpovídá na coells
Libor Šimo (libcosenior):

Týmto:

printf("Beh casti programu trval %.3g sekund", (float)(e - s) / CLOCKS_PER_SEC);

si ma upozornil na čo som pozabudol.
A teda že stačí, aby jedna hodnota výpočtu bola float a výsledok je float.
Díky. :-)

Nahoru Odpovědět 11.4.2014 13:11
Aj tisícmíľová cesta musí začať jednoduchým krokom.
Avatar
Odpovídá na Libor Šimo (libcosenior)
Luboš Běhounek (Satik):

Ta funkce je pro C i C++.
Tyhle základní funkce jsou v obou jazycích shodné.

A Winapi funkce můžeš volat z (téměř) libovolného jazyka - z C, C++, C#, Javy, Pascalu...

Nahoru Odpovědět 11.4.2014 13:25
:)
Děláme co je v našich silách, aby byly zdejší diskuze co nejkvalitnější. Proto do nich také mohou přispívat pouze registrovaní členové. Pro zapojení do diskuze se přihlas. Pokud ještě nemáš účet, zaregistruj se, je to zdarma.

Zobrazeno 15 zpráv z 15.