前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
工具
TVP
发布
社区首页 >专栏 >cpu time和clock time、real time、wall time都是什么?以及在不同语言中如何计算?

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

作者头像
自学气象人
发布2023-06-21 14:57:36
1.6K0
发布2023-06-21 14:57:36
举报
文章被收录于专栏:自学气象人自学气象人

概念辨析

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 seconds\n", cpu_time);
    printf("Clock time: %f seconds\n", 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 seconds\n", 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。

本文参与 腾讯云自媒体同步曝光计划,分享自微信公众号。
原始发表:2023-03-22,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 自学气象人 微信公众号,前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体同步曝光计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
0 条评论
热度
最新
推荐阅读
目录
  • 概念辨析
  • 关于CPU time的疑惑
  • 怎么计算CPU time 和Clock time
相关产品与服务
命令行工具
腾讯云命令行工具 TCCLI 是管理腾讯云资源的统一工具。使用腾讯云命令行工具,您可以快速调用腾讯云 API 来管理您的腾讯云资源。此外,您还可以基于腾讯云的命令行工具来做自动化和脚本处理,以更多样的方式进行组合和重用。
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档