Problem z mierzeniem czasu programu

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;
5
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);
}
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.

0

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

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.

1

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.

1
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::microseconds albo nawet do nanosekund, albo uwzględnij w pomiarach całość programu.

0

Przepraszam że dopiero teraz ale miałem ostatnio bardzo mało czasu. Prawdopodobnie 0 wynika z tego że fragment kodu wykonuje się bardzo szybko (testwoalem na wielu swoich programach).
No i na przyszlość tak jak podpowiadaliście chrono jest o wiele lepszym sposobem mierzenia czasu. Dziękuje wzsystkim za pomoc!

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