Pouze tento týden sleva až 80 % na e-learning týkající se C# .NET
Aktuálně: Postihly zákazy tvou profesi? Poptávka po ajťácích prudce roste, využij slevové akce 80% výuky zdarma!
birthday
Avatar
Libor Šimo (libcosenior):11.4.2014 9:37

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:11.4.2014 10:02

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):11.4.2014 10:16

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
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):11.4.2014 10:37

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:11.4.2014 10:39

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):11.4.2014 10:55

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:11.4.2014 12:35

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
Tento výukový obsah pomáhají rozvíjet následující firmy, které dost možná hledají právě tebe!
Avatar
Luboš Běhounek Satik
Autoredaktor
Avatar
Odpovídá na coells
Luboš Běhounek Satik:11.4.2014 12:44

Č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
https://www.facebook.com/peasantsandcastles/
Avatar
coells
Redaktor
Avatar
Odpovídá na Luboš Běhounek Satik
coells:11.4.2014 12:44

Jenže já jsem na OS X :-P

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

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):11.4.2014 13:02

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):11.4.2014 13:07

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):11.4.2014 13:11

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
Luboš Běhounek Satik
Autoredaktor
Avatar
Odpovídá na Libor Šimo (libcosenior)
Luboš Běhounek Satik:11.4.2014 13:25

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
https://www.facebook.com/peasantsandcastles/
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.