Để nắm được hiệu suất của chương trình hoặc 1 đoạn chương trình, cần đo lường thời gian thực thi của một hàm hay 1 đoạn chương trình, điển hình nhất là ở các thuật toán xử lý nhiều dữ liệu như thuật toán sắp xếp, xử lý nhiều pixels của frame trong video.
Thư viện time.h trong C/C++ có hỗ trợ lấy được thời gian, từ đó có thể dùng để tính toán đo lường thời gian thực thi của hàm.
Thư viện sử dụng
Thư viện time.h là một thư viện được xây dựng sẵn trong C/C++ và thường sử dụng để tính toán thời gian. Trong C/C++ để sử dụng thư viện này cần include thư viện này vào những file cần dùng.
#include <time.h>
Cấu trúc dữ liệu và hàm trong time.h
clock()
: hàm trả về số tick từ khi chương trình được chạy.clock_t
: kiểu dữ liệu mà hàmclock()
trả về,clock_t
là kiểu định nghĩa lại củaunsinged long
.
#ifndef _CLOCK_T #define _CLOCK_T typedef __darwin_clock_t clock_t; #endif /* _CLOCK_T */
Và
typedef unsigned long __darwin_clock_t; /* clock() */
Macro CLOCKS_PER_SEC
là giá trị tích tắc đồng hồ trên 1 giây (number of clock ticks per second), trong hệ thống 32-bit được định nghĩa như sau:
#define CLOCKS_PER_SEC 1000000 /* [XSI] */
Sử dụng thư viện time.h để đo thời gian thực thi của hàm
Ý tưởng:
- Lấy thời gian trước khi gọi hàm -
start = clock()
. - Gọi hàm.
- Lấy thời gian sau khi gọi hàm -
end = clock()
. - Tính hiệu của
end
vàstart
.
#include <time.h> clock_t start, end; double duration; start = clock(); … /* Do the work. */ end = clock(); duration = ((double) (end - start)) / CLOCKS_PER_SEC;
Lấy duration
chia cho macro CLOCKS_PER_SEC
.
Code mẫu đo thời gian thực thi của thuật toán
Đo thời gian thực thi của thuật toán Interchange Sort.
Interchange Sort
// // main.c // time // // Created by NguyenNghia on 10/25/16. // Copyright © 2016 nguyennghia. All rights reserved. // #include <stdio.h> #include <time.h> #include <stdlib.h> void swap(int *num1, int *num2) { int temp; temp = *num1; *num1 = *num2; *num2 = temp; } int randomElementInArray(int a, int b){ return a + rand() % (b - a + 1); } void interchangeSort(int *arr, int n){ for (int i = 0; i < n; i++) { for (int j = 1; j < n; j++) { if(arr[j] > arr[i]){ swap(&arr[j], &arr[i]); } } } } void printArray(int* arr, int n){ for (int i = 0; i < n; i++) { printf("%d\t", arr[i]); } printf("\n"); } int main(int argc, const char * argv[]) { clock_t start, end; double duration; int n = 9999; // init data int *arr = (int*)malloc(n); for (int i = 0; i < n; i++) { arr[i] = randomAlementInArray(0, n); } start = clock(); interchangeSort(arr, n); end = clock(); duration = (double)(end - start) / CLOCKS_PER_SEC; printf("interchangeSort take %f seconds", duration); printArray(arr, n); return 0; }
* Xem nguồn bài viết: https://eitguide.net/cach-do-thoi-gian-thuc-thi-cua-mot-function-trong-cc/