Từ 1 tới 6 trên tổng số 6 kết quả

Đề tài: Làm cách nào để đo thời gian thực hiện thuật toán theo nano giây

  1. #1
    Ngày gia nhập
    03 2011
    Bài viết
    54

    Mặc định Làm cách nào để đo thời gian thực hiện thuật toán theo nano giây

    Em chỉ biết mỗi 1 hàm để đo thời gian thực hiện thuật toán là hàm clock() nhưng hàm clock() chỉ có thể đo thời gian theo mili giây, dùng hàm clock đo những thuật toán thực hiện nhanh thì toàn trả về giá trị 0, vậy có cách nào để đo thời gian tính theo nano giây không ???

  2. #2
    Ngày gia nhập
    11 2010
    Bài viết
    589

    Trích dẫn Nguyên bản được gửi bởi vungtroicuabo Xem bài viết
    Em chỉ biết mỗi 1 hàm để đo thời gian thực hiện thuật toán là hàm clock() nhưng hàm clock() chỉ có thể đo thời gian theo mili giây, dùng hàm clock đo những thuật toán thực hiện nhanh thì toàn trả về giá trị 0, vậy có cách nào để đo thời gian tính theo nano giây không ???
    Để làm gì ?
    Nên nhớ là các phép toán lấy thời gian, tính thời gian cũng gây sai số đáng kế (theo nano giây) cho kết quả rồi. Hơn nữa các đồng hồ của các HDH hiện nay chỉ chính xác tới vài chục micro giây.
    Nói chung là không có cách nào.

  3. #3
    Ngày gia nhập
    01 2011
    Nơi ở
    Hà Nội
    Bài viết
    188

    Trích dẫn Nguyên bản được gửi bởi vungtroicuabo Xem bài viết
    Em chỉ biết mỗi 1 hàm để đo thời gian thực hiện thuật toán là hàm clock() nhưng hàm clock() chỉ có thể đo thời gian theo mili giây, dùng hàm clock đo những thuật toán thực hiện nhanh thì toàn trả về giá trị 0, vậy có cách nào để đo thời gian tính theo nano giây không ???
    Mình có ý tưởng như thế này: bạn cho chạy đoạn code của bạn 1000 lần hoặc 10000 lần ... sau đó lấy thời gian đó chia cho số lần chạy lặp lại! ^_^ Thử xem!

  4. #4
    Ngày gia nhập
    03 2011
    Bài viết
    12

    Trích dẫn Nguyên bản được gửi bởi vuthanhtrung90 Xem bài viết
    Mình có ý tưởng như thế này: bạn cho chạy đoạn code của bạn 1000 lần hoặc 10000 lần ... sau đó lấy thời gian đó chia cho số lần chạy lặp lại! ^_^ Thử xem!
    không biết cái này giúp gì được ko?
    http://cplus.about.com/od/howtodothingsin1/a/timing.htm

  5. #5
    Ngày gia nhập
    03 2010
    Nơi ở
    My Home
    Bài viết
    772

    Trên Windows bạn có thể dùng các hàm QuerryPerformanceFrequency, QuerryPerformanceCounter như minh họa ở link dưới đây

    http://diendan.congdongcviet.com/showthread.php?t=31921&page=2

    Còn nếu trên Linux bạn có thể làm như sau:
    P/S : Thông cảm cho tớ viết code không bao giờ comment, điều đó không tốt cho mọi người nhưng tốt cho tớ
    C Code:
    1. #include <stdio.h>
    2. #include <time.h>
    3.  
    4. //build command line
    5. //gcc -Wall timemain.c -lrt -o timemain
    6.  
    7. void swap(int* a, int* b)
    8. {
    9.     int temp = *a;
    10.     *a = *b;
    11.     *b = temp;
    12. }
    13. void quicksort(int* a, int lo, int hi)
    14. {
    15.     int pivot;
    16.     int i, j;
    17.     if(lo >= hi)
    18.         return;
    19.     pivot = a[hi];
    20.     j = hi;
    21.     i = lo - 1;
    22.     while(i < j)
    23.     {
    24.         while(a[--j] > pivot);
    25.         while(a[++i] < pivot && i <= hi);
    26.         if(i < j)
    27.             swap(a + i, a + j);
    28.     }
    29.     swap(a + i, a + hi);
    30.     quicksort(a, lo, i - 1);
    31.     quicksort(a, i + 1, hi);
    32. }
    33. int main(int argc, char * argv[])
    34. {
    35.     struct timespec ts, start, end;
    36.    
    37.     if(clock_getres(CLOCK_REALTIME, &ts) == 0)
    38.     {  
    39.         int a[] = {9, 8, 7, 6, 5, 4, 3, 2, 1, 0};
    40.         int size = sizeof(a) / sizeof(a[0]);
    41.         int i;
    42.  
    43.         clock_gettime(CLOCK_REALTIME, &start);
    44.         quicksort(a, 0, size - 1);     
    45.         clock_gettime(CLOCK_REALTIME, &end);
    46.         printf("time for this algorithm = %u nanoseconds\n", (unsigned int)((end.tv_sec - end.tv_sec) * 1000000000 + (end.tv_nsec - start.tv_nsec)));
    47.         for(i = 0; i < size; i++)
    48.             printf("%4d", a[i]);
    49.         printf("\n");
    50.     }
    51.     else
    52.     {
    53.         printf("clock realtime is not supported\n");
    54.     }
    55.     return 0;  
    56. }

  6. #6
    Ngày gia nhập
    07 2011
    Bài viết
    160

    Mặc định Làm cách nào để đo thời gian thực hiện thuật toán theo nano giây

    Trích dẫn Nguyên bản được gửi bởi vungtroicuabo Xem bài viết
    Em chỉ biết mỗi 1 hàm để đo thời gian thực hiện thuật toán là hàm clock() nhưng hàm clock() chỉ có thể đo thời gian theo mili giây, dùng hàm clock đo những thuật toán thực hiện nhanh thì toàn trả về giá trị 0, vậy có cách nào để đo thời gian tính theo nano giây không ???
    Các chip thuộc dòng x86 (Intel, AMD..) có hỗ trợ lệnh rdtsc (read time-stamp counter) để đọc số xung nhịp của clock (thường là tính từ khi bật máy). Lệnh này sẽ trả về 1 số nguyên 64 bit trong 2 thanh ghi edx:eax. Còn chèn ngôn ngữ assembly vào thế nào là tuỳ thuộc compiler của bạn

    Nhưng để đo thuật toán thì tốt hơn là cho chạy 1 vài nghìn / triệu lần rồi tính chia trung bình.

Các đề tài tương tự

  1. ADO.NET Gán thời gian hệ thống theo 1 thời gian có trước bằng SetSystemTime bị lệch giờ là do đâu?
    Gửi bởi vumanhtuan87 trong diễn đàn Thắc mắc lập trình C#
    Trả lời: 3
    Bài viết cuối: 09-08-2012, 08:57 AM
  2. Lập trình theo thời gian !!!
    Gửi bởi ngaymoi trong diễn đàn Nhập môn lập trình C/C++
    Trả lời: 10
    Bài viết cuối: 07-06-2008, 06:11 PM
  3. Lập trình C# | Thuật toán tô màu theo thời gian
    Gửi bởi BuithiHa trong diễn đàn Thắc mắc lập trình C#
    Trả lời: 2
    Bài viết cuối: 05-06-2007, 03:44 PM

Quyền hạn của bạn

  • Bạn không thể gửi đề tài mới
  • Bạn không thể gửi bài trả lời
  • Bạn không thể gửi các đính kèm
  • Bạn không thể chỉnh sửa bài viết của bạn