cpu time和clock time、real time、wall time都是什么?以及在不同语言中如何计算?

2023-06-21 14:57:36 浏览数 (2)

概念辨析

CPU time 指的是计算机处理器在执行一个特定程序时花费的时间,也就是程序在处理器上实际运行的时间。

Clock time(也称为 wall time 或 real time)指的是程序从开始执行到结束所花费的时间,包括了等待资源、I/O 操作等等与 CPU 时间无关的时间。

Real time(也称为 wall time 或 clock time)指的是从开始执行程序到程序完成所花费的时间,包括了 CPU 时间和与 CPU 时间无关的时间。

Wall time(也称为 clock time 或 real time)和 Real time 意义相同,都是指程序从开始执行到结束所花费的时间,包括了 CPU 时间和与 CPU 时间无关的时间。

关于CPU time的疑惑

1. 与 CPU 时间无关的时间包括但不限于以下几个方面:
  • • 等待 I/O 操作完成的时间,例如从磁盘读取数据或向网络发送数据时需要等待的时间。
  • • 等待其他进程或线程执行完成的时间,例如等待一个子进程完成或等待一个锁的释放。
  • • 等待用户输入的时间,例如在一个命令行程序中等待用户输入命令的时间。
  • • 等待操作系统分配资源的时间,例如等待操作系统为程序分配内存或其他资源的时间。
  • • 等待程序运行所需的其他进程或服务的启动时间,例如等待数据库服务启动完成的时间。

这些因素都可以增加程序的 Wall time(或 clock time),但它们并不会增加程序的 CPU 时间。

2.CPU time分为user cpu time 和system cpu time?

CPU time 通常分为两种类型:

  • • User CPU time:指的是程序在用户模式下执行时花费的 CPU 时间,也就是在执行应用程序的代码时所花费的时间。
  • • System CPU time:指的是程序在内核模式下执行时花费的 CPU 时间,也就是在执行操作系统内核代码时所花费的时间。例如,进行系统调用、分配内存等操作都需要在内核模式下执行。

因此,CPU time 可以分解为 User CPU time 和 System CPU time 两个部分。通常,程序的 CPU time 包括这两个部分的总和。

怎么计算CPU time 和Clock time

1.fortran语言中

在 Fortran 程序中,可以使用 Fortran 标准库中的 CPU_TIME 函数来计算程序的 CPU time,以及可以使用系统调用 SYSTEM_CLOCK 函数来获取当前的系统时间。

代码语言:javascript复制
program time
  implicit none
  real :: st1, et1, runt1, runt2
  integer*4 :: st2, et2, count_rate
  integer :: i, j, k, m
  
  call system_clock(st2, count_rate)
  call cpu_time(st1)

  do i = 1, 1000
    do j = 1, 1000
      m = m   (2 * i**2) / 5
    end do
  end do

  call cpu_time(et1)
  call system_clock(et2, count_rate)

  runt1 = et1 - st1
  runt2 = (et2 - st2) * 1.0 / count_rate

  print *, 'program running for ', runt1, ' s based on cpu'
  print *, 'program running for ', runt2, ' s based on system'
end program time

其实Clock time也可以这么写:

代码语言:javascript复制
program example
  implicit none
  integer :: clock_counts, clock_counte, clock_rate
  real :: clock_time
  
  ! 获取时钟频率
  call system_clock(count_rate=clock_rate)
  
  ! 获取程序开始执行时的时钟计数
  call system_clock(count=clock_counts)
  
  ! 程序的代码部分
  ! ...
  
  ! 获取程序结束时的时钟计数
  call system_clock(count=clock_counte)
  
  ! 计算时钟时间的差值,单位为秒
  clock_time = (clock_counte -  clock_counts)  / real(clock_rate)
  
  print *, "Clock time:", clock_time
end program example

在上述代码中,SYSTEM_CLOCK 函数返回的计数值是 CPU 计时器的值,通常用时钟周期数(clock counts)来表示。由于不同计算机的计时器可能有不同的分辨率,因此需要先调用 SYSTEM_CLOCK 函数获取时钟频率(即计时器每秒的计数数目)并除以该频率以将时钟周期转换为秒数。

2.C语言中
代码语言:javascript复制
#include <stdio.h>
#include <time.h>

int main() {
    clock_t start, end;
    double cpu_time, clock_time;

    // 获取程序开始执行时的 clock 时间
    start = clock();

    // 程序的代码部分
    // ...

    // 获取程序结束时的 clock 时间
    end = clock();

    // 计算 CPU 时间和 clock 时间的差值
    cpu_time = ((double) (end - start)) / CLOCKS_PER_SEC;
    clock_time = ((double) (end - start)) / (double) CLK_TCK;

    printf("CPU time: %f secondsn", cpu_time);
    printf("Clock time: %f secondsn", clock_time);

    return 0;
}

其中clock time 也可以这样算:

代码语言:javascript复制
#include <stdio.h>
#include <time.h>

int main() {
    time_t start, end;
    double wall_time_used;

    start = time(NULL); // 记录开始时间

    // 程序的主要代码
    int sum = 0;
    int i;
    for (i = 1; i <= 100000000; i  ) {
        sum  = i;
    }

    end = time(NULL); // 记录结束时间

    wall_time_used = difftime(end, start);
    printf("Wall time used: %f secondsn", wall_time_used);
    return 0;
}
3.在python语言中

在 Python 中,可以使用 time 模块来计算程序的 CPU 时间和 Wall Clock 时间。

代码语言:javascript复制
import time

# 获取程序开始执行时的 CPU 时间和 Wall Clock 时间
start_cpu = time.process_time()
start_clock = time.perf_counter()

# 程序的代码部分
# ...

# 获取程序结束时的 CPU 时间和 Wall Clock 时间
end_cpu = time.process_time()
end_clock = time.perf_counter()

# 计算 CPU 时间和 Wall Clock 时间的差值
cpu_time = end_cpu - start_cpu
clock_time = end_clock - start_clock

print(f"CPU time: {cpu_time} seconds")
print(f"Clock time: {clock_time} seconds")
4.linux系统中

在 Linux 系统中,可以使用命令行工具 time 来计算程序的 CPU time 和 wall time(即 clock time 或 real time)。具体使用方式为在命令行前加上 time 命令,例如:

代码语言:javascript复制
time ./my_program.exe

该命令会输出程序的 CPU 时间、wall time 和其它统计信息。注意,time 命令实际上是运行了一个外部命令,因此它只能计算该命令的执行时间,而不能直接计算一个函数或程序的 CPU 时间和 wall time。

0 人点赞