1 / 16
Feb 2019

Cześć,

W jaki sposób najlepiej zmierzyć czas wykonania programu? (C++14)

Z góry dziękuję za podpowiedź:slight_smile:

  • created

    Feb '19
  • last reply

    Feb '19
  • 15

    replies

  • 2.1k

    views

  • 5

    users

  • 5

    likes

  • 5

    links

#include

using namespace std;

clock_t start, stop;
double czas;

int main()
{
start = clock();
\ Tu jest program\
stop = clock();

czas = (double) (stop-start) / CLOCKS_PER_SEC;
cout << czas;

return 0;
}

To powinno działać, jeśli coś jest niejasne to pisz - wytłumaczę

Dzięki.

Pokazało na końcu “0”. Czy to znaczy że dokładność jest za mała? Jak zwiększyć?

PS A bibliotek dodatkowych nie trzeba?

Bibliotek do liczenia czasu wykonywania programu nie trzeba, proponowałbym użycie funkcji setprecision(x) z biblioteki iomanip gdzie x to ilość miejsc po przecinku do których ma być dokładność, dodaj setprecision(), po cout

ciekawe, co da setprecision(), skoro zadeklarowałeś zmienną czas jako int ?

rozumiem, że chcesz pomóc, ale przedtem sprawdzaj, na ile twoje rady są słuszne :slight_smile:
i oczywiście wklejaj poprawnie kod

Przyznaję, zapomniałem o tym że wcześniej zadeklarowałem czas jako int a nie float ale nie przeglądałem kodu po raz kolejny bo bylem przekonany że jest inaczej, pewnie gdybym miał dostęp do jakiegoś kompilatora zorientowałbym się w czym tkwi błąd

Poza tym myślę że już podsunięcie praktycznie całego rozwiązania oraz funkcji jakich należy użyć jest wystarczającą pomocą a nawet początkujący programista może sam dojść do tego w czym tkwi problem i zmienić typ danych, a wiadomo że nie chodzi o podawanie dokładnych rozwiązań żeby ktoś mógł zrobić kopiuj wklej i nazywać się programistą

Ciekawy jestem, co chcesz zrobić, jak chcesz wykorzystać zdobytą wiedzę? Tzn co chcesz z tym fantem zrobić, z czasem wykonania programu?

Od pytającego wymaga się poprawnego wklejania do pytań swoich kodów [jeżeli wkleja]. Tym bardziej dotyczy to podpowiadających.
Poniżej przykład poprawnego wklejenia kodu:

#include <iostream>

using namespace std;

clock_t start, stop;
double czas;

int main() {
      start = clock();
      /// i dalej program

No i taka [dobra?] wiadomość dla niewtajemniczonych. Istnieje strona ideone.com23, na której są te wszystkie kompilatory, które są na spoju i też niektóre [c++, python …] w kilku wersjach. Na ideone można sprawdzić nie tylko poprawność kompilacji ale także [jak się wklei test] poprawność wykonania. No i czas wykonania, dla danego/ych testów.
Po przetestowaniu, można tutaj wkleić link do ideone ze swoim kodem i przynajmniej może będzie bardziej czytelne formatowanie kodu [jeżeli ktoś nie potrafi zrobić tego tutaj] <-- https://ideone.com/dcFBzk6

PS
Dział pl.spoj.com nie jest miejscem na zadawanie pytań. Jeżeli pytanie dotyczy zadania - dział Zbiór zadań, a tutaj pytanie dotyczy chyba jakiegoś? Jeżeli nie, to odpowiedniejszym byłoby dział dotyczący podstaw programowania.

Odpowiadam:
Ciekawy jestem, co chcesz zrobić, jak chcesz wykorzystać zdobytą wiedzę? Tzn co chcesz z tym fantem zrobić, z czasem wykonania programu? -> chcę mierzyć czas swojego programu żeby ocenić wpływ zmian na prędkość wykonania.

Od pytającego wymaga się poprawnego wklejania do pytań swoich kodów -> to było generalne pytanie do optymalizacji wszystkich kodów nie do szczególnego dlatego nie wkleiłem.

Ideone, czas wykonania -> z ideone korzystam (fajna sprawa), niestety czas mierzy z dokładnością do s (więc nie wiem czy było to 0,01s czy 0,49s bo pokazuje 0s)

Dział -> rozumiem że masz na myśli dział “Tutoriale, poradniki”. Będę się stosował.

PS Dzięki za podpowiedź forxn i korektę mariusz193 -> już wiem jak mierzyć
PS2 Chyba że można jesze lepiej? np. w mili (lub nano) s -> w takim razie proszę o podpowiedź :wink:

thx

Jeżeli napiszesz tutorial lub poradnik, to jaK Najbardziej, możesz go tam umieścić. Lub jeśli maSZ konkretrne pytanie do jakiegoś wątku w tamtym dziale to możesz się tam dokleić. Jeżeli jednak pytasz, rozpoczynając nowy wątek, to raczej nie. Moim zdaniem odpowiednim jest dział PDSTPROG.

Sorry, to był taki skrót myślowy. Właśnie to miałem na myśli. Jak chcesz to zrobić [mierzyć czas …], gdy wyjdzie ci zero?

To było do podpowiadającego:

Spoko zero już nie wychodzi odkąd zmieniłem int na float :slight_smile:

Jak chcę mierzyć? -> Pomysł mam taki: umieszczam odpowiednio powyższy kod do programu umieszczonego na ideone. Robię kilka pomiarów dla danego wejścia i wyciągam średnią. Może zrobię jakąś statystykę z otrzymanych wartości żeby zobaczyć czy zmienność pomiaru nie jest zbyt duża.

Każdy odpowiada jak uważa za stosowne adekwatnie do sytuacji (np. real vs forum i jego regulamin), światopoglądu etc. Gotowce, np. gotowy wzór, do którego wystarczy podstawić liczbę nie są złe same z siebie. Gotowe fragmenty kodu także. Raczej w pracy nie mówi się kolegom i koleżankom, że nie poda im się gotowca tylko ideę “jak to zakodować” :wink:

Istnieje też coś takiego jak wyszukiwarka. Ja polecam DuckDuckGo. Po wklepaniu “!stack measure execution time c++” wyskakuje sporo informacji. Można wpisać samo “measure (…)” i trafić na link https://stackoverflow.com/questions/22387586/measuring-execution-time-of-a-function-in-c6. Nota bene Stack Overflow jest dość ważnym elementem rozwoju niewtajemniczonych w XXI wieku.

W szczególności dzięki serwisowi nie muszę pisać, że “It is not a requirement to get the same output always because the CPU of your machine can be less or more used by other processes running on your computer.”. W ogólności mierzenie czasu wykonywania programów nie jest proste i sytuacja, kiedy optymalny algorytm jest wolniejszy niż brute force nie jest czymś nadzwyczajnym. I znowu - potęga wyszukiwarek - https://oi.edu.pl/l/srodowisko/4

PS
Mój pierwszy “ambitny” program mierzył czas działania algorytmów sortujących i wyświetlał w cmd (w kolorkach!) wyniki. Ze względu na ilość goto wolę się do tego kodu nie przyznawać, ale rzeczywiście sporo można się dowiedzieć próbując stworzyć coś tego typu. A jaka radość, że choć wszystko wypieprza się na trzecim teście to jednak ładnie wygląda :wink: I już wiesz dlaczego goto trzeba unikać :wink:

Tak, to mnie w zupełności uspokoiło :wink: i potwierdziło moje przypuszczenia [obawy]. :wink: :wink:

@tarpauwatratar, nie mam pojęcia na ile twoje linki są dobrą podpowiedzią. Trzeba by zapytać pytającego: Do you speak English? Google mają to do siebie, że wyrzucają z równą chęcią bezwartościowe śmieci jak i perełki, ale aby to ocenić trzeba już trochę wiedzieć. Działa to na zasadzie, lepiej niech mówią źle niż wcale, więc jeżeli dana strona jest mocno krytykowana, to i tak może trafić na pierwsze miejsce w wyszukiwarce. Dla tego nie krytykuję [pewnego videokursu].

@nenow79, moja rada, jeżeli chcesz robić takie pomiary aby optymalizować swój kod, to znajdź o tym książkę [optymalizacja kodu] i poczytaj, a koniecznie jeszcze wcześniej dobrą książkę o C/C++.

Jeżeli masz w jakimś zadaniu tle, to najlepiej poczytaj wątek o nim, lub zadaj konkretne pytanie.

I niby wynika to z pomiaru czasu? Powiem, że to kompletna bzdura. :wink:

Materiały na stronie Olimpiady Informatycznej są w języku polskim. A co do reszty - If inglisz noł den chęci wery macz + gugl tłumacz + lern inglisz. Bez porządnego B1 raczej ciężko czymkolwiek zajmować się na poważnie w dzisiejszych czasach.

Stack Overflow, DuckDuckGo oraz Olimpa Informatyczna nie są najgorsze w porównaniu z [pewien videokurs] :wink: A tak na poważnie: umiejętność weryfikowania źródeł jest kluczowa i niestety trzeba ją posiąść nawet przed ingliszem.

To z braku wyników pomiaru czasu po pewnych teoretycznie obsłużonych operacjach :wink:

Dobra rada

Hi colleagues, first of all thanks for all the feedbacks.
I didn’t expect so much intrest while writing this post :slight_smile:

Fore sure I’ll check your hints (also the english once).
I’m not profesionall programer, I’m engineer in automotive industry. Programming is my hobby which I adore :stuck_out_tongue:
Due to that reason basic level of time measurement is sufficient at this moment.
I’m going to start to cover more urgent gaps in my programming education first :slight_smile:

Bravo you!

Zwiększ po prostu wielkość testu[ów] i rób to aż do skutku [powiększaj test, gdy już będzie więcej niż zero].

Jeżeli nie czujesz różnicy między typem float a double [i nie chodzi mi o różnicę rozmiaru], to najlepiej jednak zawsze używaj typu double.

Jeżeli chcesz porównywać tylko różnicę czasu wykonania tylko swoich wersji programu tylko na [w] swoim/twoim środowisku, nie potrzebujesz pomiaru w kontretnie przeliczonej jednostce [sek]. Wystarczy policzyć ilość cykli zegara clock() [lub dowolnego innego - dokładniejszego]. Do tego nie potrzebujesz double [a tym bardziej float], czyli np tak:

int start = clock(); //lub clock_t start = clock(); // zmienne globalne są beee

// mierzony kod;

cout << "Pomierzony czas w jednostkach clock() = " <<  clock() - start << endl; 

Wart jednak orientować się w temacie optymalizacji, aby wiedzieć co i jak robić. No i są już gotowe do tego programy:
time <-- linux
profilery <-- to już inna bajka.

Yes, it’s very good idea. Bravo you, second time :wink: