Pertanyaan C Timer Difference mengembalikan 0ms


Saya belajar C (dan Cygwin) dan mencoba menyelesaikan sistem eksekusi jarak jauh yang sederhana untuk sebuah tugas.

Satu persyaratan sederhana yang saya dapatkan adalah: 'Klien akan melaporkan waktu yang diambil untuk server untuk menanggapi setiap permintaan.'

Saya sudah mencoba mencari di sekitar dan menerapkan solusi kerja lainnya tetapi selalu mendapatkan kembali 0 sebagai hasilnya.

Cuplikan dari apa yang saya miliki:

#include <time.h>

for(;;)
{
    //- Reset loop variables
    bzero(sendline, 1024);
    bzero(recvline, 1024);
    printf("> ");
    fgets(sendline, 1024, stdin);

    //- Handle program 'quit'
    sendline[strcspn(sendline, "\n")] = 0;
    if (strcmp(sendline,"quit") == 0) break;

    //- Process & time command
    clock_t start = clock(), diff;
    write(sock, sendline, strlen(sendline)+1);
    read(sock, recvline, 1024);
    sleep(2);
    diff = clock() - start;
    int msec = diff * 1000 / CLOCKS_PER_SEC;

    printf("%s (%d s / %d ms)\n\n", recvline, msec/1000, msec%1000);
}

Saya juga mencoba menggunakan pelampung, dan bukannya membagi dengan 1000, mengalikan dengan 10.000 hanya untuk melihat apakah ada kilatan suatu nilai, tetapi selalu mendapatkan kembali 0. Jelas ada yang salah dengan cara saya menerapkan ini, tetapi setelah banyak membaca saya tidak bisa mengetahuinya.

--Edit--

Cetakan nilai:

clock_t start = clock(), diff;
printf("Start time: %lld\n", (long long) start);
//process stuff
sleep(2);
printf("End time: %lld\n", (long long) clock());
diff = clock() - start;

printf("Diff time: %lld\n", (long long) diff);
printf("Clocks per sec: %d", CLOCKS_PER_SEC);

Hasil: Waktu mulai: 15 Waktu akhir: 15 Waktu Diff: 0 Jam per detik: 1000

- KODE KERJA AKHIR -

#include <sys/time.h>

//- Setup clock
struct timeval start, end;

//- Start timer
gettimeofday(&start, NULL);

//- Process command
/* Process stuff */

//- End timer
gettimeofday(&end, NULL);

//- Calculate differnce in microseconds
long int usec =
    (end.tv_sec * 1000000 + end.tv_usec) -
    (start.tv_sec * 1000000 + start.tv_usec);

//- Convert to milliseconds
double msec = (double)usec / 1000;

//- Print result (3 decimal places)
printf("\n%s (%.3fms)\n\n", recvline, msec);

4
2017-09-07 11:11


asal


Jawaban:


Saya pikir Anda salah paham clock() dan sleep().

clock mengukur waktu CPU yang digunakan oleh program Anda, tetapi sleep akan tidur tanpa menggunakan waktu CPU. Mungkin Anda ingin menggunakannya time() atau gettimeofday() sebagai gantinya?


4
2017-09-07 11:33



Cygwin berarti Anda menggunakan Windows.

Pada Windows, "waktu saat ini" pada thread eksekusi hanya diperbarui setiap 64 detik (kira-kira 16ms), jadi jika clock() didasarkan pada itu, bahkan jika itu mengembalikan sejumlah milidetik, itu tidak akan pernah lebih tepat daripada 15.6ms.

GetThreadTimes() memiliki batasan yang sama.


2
2017-09-07 11:37