Search…

Đo Lường Thời Gian Thực Thi Của Hàm trong C++

04/11/20203 min read
Cách thức đo thời gian thực thi của hàm trong C/C++ để ước lượng hiệu suất của chương trình.

Để 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àm clock() trả về, clock_t là kiểu định nghĩa lại của unsinged long.
#ifndef _CLOCK_T
#define _CLOCK_T
typedef __darwin_clock_t clock_t;
#endif /* _CLOCK_T */

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 endstart.
#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/

IO Stream

IO Stream Co., Ltd

30 Trinh Dinh Thao, Hoa Thanh ward, Tan Phu district, Ho Chi Minh city, Vietnam
+84 28 22 00 11 12
developer@iostream.co

383/1 Quang Trung, ward 10, Go Vap district, Ho Chi Minh city
Business license number: 0311563559 issued by the Department of Planning and Investment of Ho Chi Minh City on February 23, 2012

©IO Stream, 2013 - 2024