time

include語法

#include <time.h>

計算程式執行時間

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
#include <iostream>
#include <time.h>
using namespace std;
void func() {
  int temp;
  for (int i=0 ; i <1000; i++) {
    temp = i;
  }
}
int main() {
  //time_t結構
  time_t start_t, end_t;
  double diff;

  // 將time_t結構記憶體位址傳入
  time(&start_t);
  // 要執行的函式
  func();
  // 將time_t結構記憶體位址傳入
  time(&end_t);
  // 計算差距秒數
  // end_t - start_t
  diff = difftime(end_t, start_t);
  cout << "second = " << diff << endl;
  return 0;
}
second = 0

取得現在時間

取得從1970/01/01至今累加的秒數,以長整數(long)存放此秒數。

語法

time_t time(time_t *tloc);
  • 參數代入nullptr = 0
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
#include <iostream>
#include <time.h>
using namespace std;
int main() {
  // 方式1
  // 把nullptr也就是0作為參數代入time()函式
  time_t now = time(0);
  cout << "now = " << now << endl;
  // 方式2
  // 將now2的位址作為參數代入time()函式
  time_t now2;
  time(&now2);
  cout << "now2 = " << now2 << endl;
  return 0;
}
now = 1733883906
now2 = 1733883906

tm結構

1
2
3
4
5
6
7
8
9
10
11
12
struct tm
{
  int tm_year;  // 年份:其值等於實際年份減去1900
  int tm_mon;   // 月份:取值區間為[0,11],其中0代表一月,11代表12月
  int tm_mday;  // 日期:一個月中的日期,取值區間為[1,31]
  int tm_hour;  // 時:取值區間為[0,23]
  int tm_min;   // 分:取值區間為[0,59]
  int tm_sec;   // 秒:取值區間為[0,59]
  int tm_wday;  // 星期:取值區間為[0,6],其中0代表星期日,6代表星期六
  int tm_yday;  // 從每年的1月1日開始算起的天數:取值區間為[0,365]
  int tm_isdst; // 夏令時標識符,此欄位意義不大
};

localtime

將time_t整數轉成tm結構

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
#include <iostream>
#include <time.h>
using namespace std;
int main() {
  time_t now = time(0);
  tm tmnow;
  localtime_r(&now, &tmnow);
  string time_str =
      to_string(tmnow.tm_year + 1900) + "/" +
      to_string(tmnow.tm_mon + 1) + "/" +
      to_string(tmnow.tm_mday) + " " +
      to_string(tmnow.tm_hour) + ":" +
      to_string(tmnow.tm_min) + ":" +
      to_string(tmnow.tm_sec);
  cout << "time_str = " << time_str << endl;
  return 0;
}
time_str = 2024/12/11 11:48:45

計算執行時間

gettimeofday

include

#include <sys/time.h>

語法

int gettimeofday(struct timeval *tv, struct timezone *tz);

用到的參數結構

struct timeval {
  time_t tv_sec;  // 1970-01-01開始的秒數
  suseconds_t tv_usec;  // 表示微秒(1秒 = 1000000微秒)
};
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
#include <iostream>
#include <sys/time.h>
using namespace std;
int main() {
  timeval start, end;
  // 開始計時
  gettimeofday(&start, nullptr);
  for (int i = 0; i < 1000000; i++);
  // 結束計時
  gettimeofday(&end, nullptr);
  // 儲存耗時的秒數與微秒
  timeval t_val;
  // end微秒與start微秒相減
  t_val.tv_usec = end.tv_usec - start.tv_usec;
  // end秒數與start秒數相減
  t_val.tv_sec = end.tv_sec - start.tv_sec;
  // 若end微秒與start微秒相減為負數
  if (t_val.tv_usec < 0) {
    // 將負的微秒轉正
    // 使用固定公式 tv_usec = 1000000 + tv_usec
    // 例如:若 tv_usec = -200,則變為 tv_usec = 1000000 - 200 = 999800。
    t_val.tv_usec = 1000000 + t_val.tv_usec;
    // 同時,從秒部分(tv_sec)中減去 1,補償這多出的一秒。
    t_val.tv_sec--;
  }
  cout << "耗費:" << t_val.tv_sec << "秒" << t_val.tv_usec << "微秒。" << endl;
//  假設
//  開始時間為 start = {tv_sec = 10, tv_usec = 500000},
//  結束時間為 end = {tv_sec = 12, tv_usec = 300000}。
//  則:
//  初始計算:
//  tv_usec = 300000 - 500000 = -200000
//  tv_sec = 12 - 10 = 2
//  微秒補正:
//  tv_usec = 1000000 - 200000 = 800000
//  tv_sec = 2 - 1 = 1
//  最終結果:
//  tv_sec = 1
//  tv_usec = 800000
//  表示耗時 1秒800毫秒。
  return 0;
}
耗費:0秒1213微秒。

results matching ""

    No results matching ""