Najlepsza metoda pomiaru czasu w C?


80

Jaki jest najlepszy sposób na synchronizację sekcji kodu z wysoką rozdzielczością i przenośnością?

Czy istnieje standardowa biblioteka, która miałaby rozwiązanie wieloplatformowe?

Odpowiedzi:


137

Myślę, że to powinno działać:


10
Jest to rzeczywiście dobre, ponieważ podaje czas procesora, a nie czas, który upłynął (na upływający czas mogą mieć wpływ inne procesy). Należy tylko pamiętać, że liczba 10 sekund niekoniecznie oznacza, że ​​będzie działać po upływie 10 sekund, ponieważ mogą istnieć kwestie dotyczące I / O. To mierzy TYLKO procesor .
paxdiablo

1
Użyłem tego setki razy i jest to najlepsze / najłatwiejsze rozwiązanie na to pytanie
Gerhard

4
możesz nawet włożyć to wszystko do makra, jeśli często mierzysz wiele rzeczy: #define timing (a) start = clock (); za; diff = clock () - start; msec = diff * 1000 / CLOCKS_PER_SEC; printf ("msek:% d \ n", msek); a następnie wywołaj: timing (IntenseFunc1 ())
eqzx

3
clock_t jest zwykle długi, a CLOCKS_PER_SEC to 1000000. W tym przypadku różnica większa niż 4 sekundy spowoduje przepełnienie i dziwne wyniki
Begelfor

2
@paxdiablo Otrzymuję całkowicie równoważne wyniki, jak w przypadku gettimeofday (), nie jestem pewien, co tu mówisz.
user3467349

21

gettimeofday () prawdopodobnie zrobi to, co chcesz.

Jeśli korzystasz ze sprzętu firmy Intel, oto jak odczytać licznik instrukcji procesora w czasie rzeczywistym. Podaje liczbę cykli procesora wykonanych od momentu uruchomienia procesora. Jest to prawdopodobnie najdrobniejszy, najniższy licznik, jaki można uzyskać do pomiaru wydajności.

Zauważ, że jest to liczba cykli procesora. W Linuksie możesz pobrać prędkość procesora z / proc / cpuinfo i podzielić, aby uzyskać liczbę sekund. Konwersja tego na podwójną jest całkiem przydatna.

Kiedy uruchomię to na moim pudełku, dostaję

11867927879484732
11867927879692217
tak długo trwało wywołanie printf: 207485

Oto przewodnik dla programistów firmy Intel, który zawiera mnóstwo szczegółów.




1

Jeśli nie chcesz czasu procesora, myślę, że to, czego szukasz, to struktura timeval.

Do obliczenia czasu realizacji używam poniższego:


0

Wysoka rozdzielczość jest względna ... Patrzyłem na przykłady i przeważnie odpowiadają one milisekundom. Jednak dla mnie ważny jest pomiar mikrosekund. Nie widziałem rozwiązania niezależnego od platformy przez mikrosekundy i pomyślałem, że coś takiego jak poniższy kod będzie przydatne. Na razie mierzyłem czas tylko w systemie Windows i najprawdopodobniej dodam implementację gettimeofday (), robiąc to samo w systemie AIX / Linux.

Stosowanie:

Korzystając z naszej strony potwierdzasz, że przeczytałeś(-aś) i rozumiesz nasze zasady używania plików cookie i zasady ochrony prywatności.
Licensed under cc by-sa 3.0 with attribution required.