Problem z mierzeniem czasu programu

Odpowiedz Nowy wątek
2019-08-12 10:47
0

Witam,
mam problem z mierzeniem czasu wykonywania programu.
Niezależnie od tego ile liczb do sortowania wpiszę ostatecznie czas wynosi: 0.00000000 (nie ważne jaką ilość miejsc po przecinku wstawie). Co ciekawe użycie nawet najprostszej pętli wyświetlającej liczby od 0 do 10 w przedziale między start a koniec powoduje że czas wykonywania pokazuje się poprwany. Wykonałem już sporo różnych innych wariantów ale dalej nic..
Jeżeli ktoś sie z czymś takim spotkał bądź zauważył gdzie popełniłem błąd(może czegoś do końca nie zrozumiałem) i może pomóc z góry dziękuje (:

 double roznica;
cout.precision(50); //liczba miejsc po przecinku, dokladnosc naszego wyniku
clock_t start, koniec; //inicjacja zmiennych zegarowych
start=clock(); //zapisanie czasu startu mierzenia
//-------------------------------------------------------------------------------------
//start {MOMENT W KTÓRYM CHCE ZACZĄĆ MIERZYĆ CZAS}
        int a,i;
        float pomocnicza;
        for(a=1; a<liczba_elementow; a=3*a+1) {};
        a=a/9;
        if(!a)
            a++;
        while(a)
        {
            for(int j=liczba_elementow-a-1; j>=0; j--)
            {
                pomocnicza=tab[j];
                i=j+a;
                while((i<liczba_elementow)&&(pomocnicza>tab[i]))
                {
                    tab[i-a]=tab[i];
                    i=i+a;
                }
                tab[i-a]=pomocnicza;
            }
            a =a/3;
        }
//koniec wykonywania progrmau
//-------------------------------------------------------------------------------------
koniec=clock();//zapisanie konca mierzenia

//-------------------------------------------------------------------------------------

        cout<<"\nPo sortowaniu: ";
        for(i = 0; i < liczba_elementow; i++)
        {
            cout<<" "<<tab[i];
        }
cout.setf(ios::fixed);
roznica=(koniec-start)/(double)CLOCKS_PER_SEC;//obliczenie roznicy, czyli czasu wykonania
cout<<endl;
cout<<"Czas wykonania: "<<roznica;

        cout<<endl;

Pozostało 580 znaków

2019-08-12 11:09
4
template <typename func_t, typename... Args>
std::chrono::milliseconds measure_execution_time(func_t&& func, Args&&... args)
{
    auto start = std::chrono::high_resolution_clock::now();
    func(std::forward<Args>(args)...);
    auto end = std::chrono::high_resolution_clock::now();
    return std::chrono::duration_cast<std::chrono::milliseconds>(end - start);
}

Pozostało 580 znaków

2019-08-12 11:12
kq
3

Użyj <chrono>, afaik clock() jest średnim rozwiązaniem, bo mało wygodne, i nie wspiera wielowątkowości.

Poza tym sprawdź czy faktycznie nie masz po prostu stałego czasu wykonania.


Pozostało 580 znaków

2019-08-13 12:09
0

Dziękuję za podpowiedź
Sprawdzę wieczorem i dam znać czy się udało ;

Pozostało 580 znaków

2019-08-13 23:23
0

Sytuacja taka sama jak w pierwszym przypadku (cały czas wynik 0). Testowałem sobie <chrono> na paru innych programach i wydaje mi się że na 100% wina leży po stronie kodu źródłowego. Na pewno w wolnej chwili sprawdze wszystko od początku. Dzięki @kq @pingwindyktator za podsunięcie alternatywy ;)
Jeżeli jest to możliwe to póki co prosze o niezamykanie tematu, jak tylko znajde przyczynę napisze co było problemem.

Pozostało 580 znaków

2019-08-14 11:53
0

Pozwolę sobie wrzucić Twój kod jeszcze raz.

#include <iostream>
#include <ctime>
#include <windows.h>
#include <time.h>
void fun(int *tab, int liczba_elementow);
using namespace std;
int main(void){
    int *t = new int [100000000]{};
    fun(t,100000000);
    return 0;
}
void fun(int *tab, int liczba_elementow){
    double roznica;
    cout.precision(50); //liczba miejsc po przecinku, dokladnosc naszego wyniku
    clock_t start, koniec; //inicjacja zmiennych zegarowych
    start=clock(); //zapisanie czasu startu mierzenia
    //-------------------------------------------------------------------------------------
    //start {MOMENT W KTÓRYM CHCE ZACZĄĆ MIERZYĆ CZAS}
            int a,i;
            float pomocnicza;
            for(a=1; a<liczba_elementow; a=3*a+1) {};
            a=a/9;
            if(!a)
                a++;
            while(a)
            {
                for(int j=liczba_elementow-a-1; j>=0; j--)
                {
                    pomocnicza=tab[j];
                    i=j+a;
                    while((i<liczba_elementow)&&(pomocnicza>tab[i]))
                    {
                        tab[i-a]=tab[i];
                        i=i+a;
                    }
                    tab[i-a]=pomocnicza;
                }
                a =a/3;
            }
    //koniec wykonywania progrmau
    //-------------------------------------------------------------------------------------
    koniec=clock();//zapisanie konca mierzenia

    //-------------------------------------------------------------------------------------

            cout<<"\nPo sortowaniu: ";
           /* for(i = 0; i < liczba_elementow; i++)
            {
                cout<<" "<<tab[i];
            }*/
    cout.setf(ios::fixed);
    roznica=(koniec-start)/(double)CLOCKS_PER_SEC;//obliczenie roznicy, czyli czasu wykonania
    cout<<endl;
    cout<<"Czas wykonania: "<<roznica;

            cout<<endl;

}

Bo de facto nic w nim nie zmieniałam, a widzę, że działa. Zakomentowałem jedynie wypisanie wartości w funkcji - bo to zajmuje najwięcej czasu. Jeżeli wrzucisz 1000 wartości do funkcji, to rzeczywiście czas będzie równy zero, ale wypisywanie wartości chwilę potrwa. Natomiast, jeśli wrzucisz więcej wartości, zobaczysz efekt - ale już bez sensu wypisywać to na ekran.

edytowany 2x, ostatnio: knifer0, 2019-08-14 11:59

Pozostało 580 znaków

2019-08-14 16:33
0

poczytaj sobie o
https://github.com/google/benchmark


We are the 4p. Existence, as you know it, is over. We will add your biological and technological distinctiveness to our own. Resistance is futile

Pozostało 580 znaków

2019-08-14 19:52
0
Trad d napisał(a):

Sytuacja taka sama jak w pierwszym przypadku (cały czas wynik 0).

@Trad d prawdopodobnie dzieje się tak ponieważ użyta rozdzielczość czasowa jest zbyt mała dla mierzonego fragmentu - mierzony kod wykonuje się poniżej milisekundy dlatego podczas wyświetlania masz to zaokrąglone do zera. W Twoim przypadku jest to możliwe, ponieważ mierzysz dość wąski wycinek kodu pomijając najwolniejsze fragmenty jak I/O (std::cout). Zwiększ rozdzielczość do std::chrono::microseconds albo nawet do nanosekund, albo uwzględnij w pomiarach całość programu.

edytowany 1x, ostatnio: several, 2019-08-14 19:53

Pozostało 580 znaków

Odpowiedz
Liczba odpowiedzi na stronę

1 użytkowników online, w tym zalogowanych: 0, gości: 1, botów: 0