GNU/Linux >> Belajar Linux >  >> Linux

mengapa jam C () mengembalikan 0

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:

  1. 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.
  2. Gunakan sizeof(clock_t) di platform Anda untuk melihat ukuran clock_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 .


Linux
  1. Mengapa Server Memblokir IP Saya?

  2. Mengapa Printf Lebih Baik Dari Echo?

  3. Mengapa Cd Bukan Program?

  1. Df Vs. Du:Mengapa Begitu Banyak Perbedaan??

  2. Mengapa Nullglob Tidak Default?

  3. Rc_status Selalu Mengembalikan "gagal"?

  1. Mengapa kita membutuhkan mktemp?

  2. gpspipe mengembalikan stempel waktu yang benar, tetapi tanggal yang salah (21 Desember 1995)

  3. sudo -i mengembalikan kesalahan