Cara yang benar menggunakan clock() untuk mengukur waktu adalah:
printf("\nTime elapsed: %.2f\n",1.0*(end-start)/CLOCKS_PER_SEC);
Ini karena clock_t tidak dijamin menjadi int, atau jenis lainnya.
Nah, apakah Anda ingin waktu something_else()
mengambil? Coba ini:
#include <sys/time.h>
#include <stdio.h>
#include <unistd.h>
int main(void) {
struct timeval start, end;
long mtime, secs, usecs;
gettimeofday(&start, NULL);
something_else();
gettimeofday(&end, NULL);
secs = end.tv_sec - start.tv_sec;
usecs = end.tv_usec - start.tv_usec;
mtime = ((secs) * 1000 + usecs/1000.0) + 0.5;
printf("Elapsed time: %ld millisecs\n", mtime);
return 0;
}
Saya kira alasannya adalah something_else()
Anda menghabiskan begitu sedikit waktu yang melebihi ketepatan clock()
. Saya mencoba memanggil clock()
akibatnya dua kali dan keduanya start
dan end
adalah nol, tetapi hasilnya masuk akal ketika saya melakukan beberapa hal yang memakan waktu antara.
Ini cuplikan kode pengujian saya:
int main(void) {
clock_t start, end;
start = clock();
int c;
for (int i = 0; i < 100; i++) {
for (int j = 0; j < (1<<30); j++) {
c++;
}
}
end = clock();
printf("start = %d, end = %d\n", start, end);
return 0;
}
Dan hasilnya di komputer saya adalah:
start = 0, end = 27700000
Juga, dua tips:
- Saat menguji, jangan gunakan pengoptimalan kompiler apa pun . Anda mungkin mengira
something_else()
Anda memakan waktu tetapi kompiler mungkin mengabaikan operasi tersebut (terutama loop) karena menganggapnya tidak berarti. - Gunakan
sizeof(clock_t)
di platform Anda untuk melihat ukuranclock_t
.
clock
fungsi tidak mengukur siklus jam CPU.
C mengatakan clock
"mengembalikan perkiraan terbaik penerapan ke waktu prosesor yang digunakan oleh program sejak awal era yang ditentukan implementasi yang hanya terkait dengan pemanggilan program."
Jika di antara dua clock
yang berurutan memanggil program Anda membutuhkan waktu kurang dari satu kesatuan clock
fungsi, Anda bisa mendapatkan 0
.
POSIX clock
mendefinisikan kesatuan dengan CLOCKS_PER_SEC
sebagai 1000000 (kesatuan adalah 1 mikrodetik).
http://pubs.opengroup.org/onlinepubs/009604499/functions/clock.html
Untuk mengukur siklus jam di x86/x64, Anda dapat menggunakan perakitan inline untuk mengambil jumlah jam dari register Penghitung Cap Waktu CPU rdtsc
.