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?

lillq
źródło

Odpowiedzi:

137

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

Sophie Alpert
źródło
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.

Mark Harrison
źródło
1

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

Do obliczenia czasu realizacji używam poniższego:

HDevejian
źródło
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:

Rohan
źródło