概念辨析
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 时间。
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。