Cần giải thích về cách đo thời gian chạy trong C

#include <stdlib.h>
#include <stdio.h>
#include <fcntl.h>
#include <unistd.h>
#include <time.h>

#define BUFFERSIZE (60000)
#define MEGABYTE (1024*1024)

int main(int argc, char * argv[]){
    long megabytes,i;
    int fo;
    char buffer[BUFFERSIZE];
    clock_t t;
    
    for (i=0; i < BUFFERSIZE ; i++)
        buffer[i]='A'; //tao du lieu tren buffer de sau day vao file

    fo = open(argv[1], O_CREAT | O_WRONLY | O_SYNC);
    megabytes=atol(argv[2]); //doi tu char thanh long int

    t = clock();
    for (i=0; i < ((MEGABYTE/BUFFERSIZE)*megabytes); i++) //ghi buffer vao fo theo megabytes lan
        write(fo,buffer,BUFFERSIZE); //ghi tu buffer vao disk

    t = clock() - t;
    double write_time = (((double)t) / CLOCKS_PER_SEC); //tinh thoi gian ghi theo s

    double rate = megabytes/write_time;
    if (write_time > 0)
        printf("Write time: %f s\nWrite rate: %.2f MB/s\n", write_time, rate); //m

    close(fo);
    return 0;
}

Mục đích của chương trình là để đo tốc độ ghi vào đĩa, mình đặt clock() như vậy đã đúng chưa nhỉ?

Mình chạy chương trình này mất tầm 30s, mà không hiểu sao write_time khi ra toàn là nhỏ hơn 1s (ví dụ như 0,9123 s).

Tự Debug đi bạn ơi.
Đặt:

start_time = clock();

for (i=0; i < ((MEGABYTE/BUFFERSIZE)*megabytes); i++) //ghi buffer vao fo theo megabytes lan
        write(fo,buffer,BUFFERSIZE); //ghi tu buffer vao disk

end_time = clock();

double write_time = ( (double)(end_time-start_time) / CLOCKS_PER_SEC); 
printf("start_time=%lu  end_time=%lu   write_time=%lf \n", start_time, end_time, write_time);

Cái gì khó hiểu cứ print ra. Ngồi suy luận biết khi nào ra

5 Likes

Bạn thử đặt hàm này trước fopen xem ạ.
Mình đang nghĩ có thể liên quan tới flag O_SYNC của bạn.

1 Like

mình đặt luôn rồi bạn ạ, cơ mà tốc độ nó không khác gì mấy

Có kết quả

printf("start_time=%lu  end_time=%lu   write_time=%lf \n", start_time, end_time, write_time);

chưa bạn ơi?

2 Likes

Sorry mình reply hơi muộn, theo mình tìm hiểu được thì tốc độ của clock()-t kia chỉ là CPU (sys) time, khác với real time.

Mình đổi sang lib sys/timeb.h thì oke nó lấy đúng real time. :v

time ./a.out ./test 200 65536
Write rate: 66 MB/s
Execute time: 3 s

real    0m3,255s
user    0m0,006s
sys     0m0,214s
2 Likes

Thì nó là CPU time nên mới phải chia cho CLOCKS_PER_SEC
http://www.cplusplus.com/reference/ctime/clock/

Nếu chạy đúng thì kết quả phải giống nhau chứ.

3 Likes

1 cái là CPU time, 1 cái là real time. Còn sao nó lại khác như vậy thì chắc phải tìm hiểu thêm bác ạ :v

    struct timeb start,end;
    
    memset(buffer, 'A', buf_size);

    fo = open(argv[1], O_CREAT | O_WRONLY | O_SYNC);
    megabytes=atol(argv[2]); //lay dung luong file
    buf_size=atol(argv[3]);

    ftime(&start);

    for (i=0; i < ((MEGABYTE/buf_size)*megabytes); i++) //ghi buffer vao fo theo megabytes lan
        write(fo,buffer,buf_size); //ghi tu buffer vao disk

    ftime(&end);
    long write_time=end.time-start.time; //tinh thoi gian ghi theo giay
83% thành viên diễn đàn không hỏi bài tập, còn bạn thì sao?