- c - 在位数组中找到第一个零
- linux - Unix 显示有关匹配两种模式之一的文件的信息
- 正则表达式替换多个文件
- linux - 隐藏来自 xtrace 的命令
我有一些代码试图确定代码块的执行时间。
#include <time.h>
#include <stdio.h>
int main()
{
clock_t start_t, end_t, total_t;
int i;
start_t = clock(); //clock start
printf("Starting of the program, start_t = %ld\n", start_t);
printf("Going to scan a big loop, start_t = %ld\n", start_t);
for(i=0; i< 10000000; i++) //trying to determine execution time of this block
{
}
end_t = clock(); //clock stopped
printf("End of the big loop, end_t = %ld\n", end_t);
total_t = (long int)(end_t - start_t);
printf("Total time taken by CPU: %lu\n", total_t );
return(0);
}
代码片段在我的机器上的输出是
Starting of the program, start_t = 8965
Going to scan a big loop, start_t = 8965
End of the big loop, end_t = 27259
Total time taken by CPU: 18294
因此,如果我的 CPU 以 21 MHz 运行并假设这是唯一被执行的事情,则每个机器周期大约等于 47 纳秒,因此 (18294 * 47) = 859818 纳秒。
这会是我代码中 for 循环的执行时间吗?我在这里做出了一些不正确的假设吗?
最佳答案
clock
函数使用的时间单位是任意的。在大多数平台上,它与处理器速度无关。它通常与外部定时器中断的频率有关——可以在软件中配置——或者与经过多年处理器发展以保持兼容性的历史值有关。您需要使用宏 CLOCKS_PER_SEC
来转换为实时。
printf("Total time taken by CPU: %fs\n", (double)total_t / CLOCKS_PER_SEC);
C 标准库旨在可在广泛的硬件上实现,包括没有内部计时器并依赖外部外围设备报时的处理器。许多平台有比 time
更精确的测量挂钟时间的方法,也有比 clock
更精确的测量 CPU 消耗的方法。例如,在 POSIX 系统(例如 Linux 和其他类 Unix 系统)上,您可以使用 getrusage
, 具有微秒精度。
struct timeval start, end;
struct rusage usage;
getrusage(RUSAGE_SELF, &usage);
start = usage.ru_utime;
…
getrusage(RUSAGE_SELF, &usage);
end = usage.ru_utime;
printf("Total time taken by CPU: %fs\n", (double)(end.tv_sec - start.tv_sec) + (end.tv_usec - start.tv_usec) / 1e-6);
如果可用,clock_gettime(CLOCK_THREAD_CPUTIME_ID)
或 clock_gettime(CLOCK_PROCESS_CPUTIME_ID)
可能会提供更好的精度。它具有纳秒精度。
请注意精度和准确度之间的区别:精度是报告值的单位。准确性是报告值与实际值的接近程度。除非你正在处理 real-time system , 没有硬性保证一段代码需要多长时间,包括调用测量函数本身。
有些处理器有周期时钟,计算处理器周期而不是挂钟时间,但这非常系统特定。
无论何时进行基准测试,请注意您测量的是在这些特定情况下该特定 CPU 上该特定可执行文件的执行情况,结果可能会也可能不会推广到其他情况。例如,除非您关闭优化,否则大多数编译器都会优化您问题中的空循环。测量未优化代码的速度通常毫无意义。即使您在循环中添加了实际工作,也要当心玩具基准测试:它们通常不具有与真实世界代码相同的性能特征。在 PC 和智能手机等现代高端 CPU 上,CPU 密集型代码的基准测试通常对缓存效果非常敏感,结果可能取决于系统上运行的其他内容、确切的 CPU 型号(由于不同的缓存大小和布局),代码恰好加载的地址等。
关于c - C 中 clock() 函数的准确性,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/39935820/
这个问题在这里已经有了答案: What specifically are wall-clock-time, user-cpu-time, and system-cpu-time in UNIX? (4
我只是尝试使用 jasmine 在 javascript/coffeescript 中进行单元测试,非常好。 我一直在尝试使用 jasmine.Clock.Mock() 来提前并触发 setTimeo
现在使用 emacs org 模式大约一个月来跟踪我所有的项目和任务。 我全天为所有事件计时,而不仅仅是与工作相关的事件。 我的问题是——我经常忘记打卡参加一项新事件(比如吃午饭)。当我返回并打卡回到
我在看 Clock来自java的类,以便我可以将其作为依赖项注入(inject)以获得更好的可测试性。但是我不明白这两种方法的区别systemUTC和 systemDefaultZone . Inst
当我设置特定日期时,我正在努力测试我的端点。 我不想使用 PowerMock 来模拟静态方法,而是决定更改我的服务的实现并使用 LocalDate.now(Clock clock) 实现来更容易地测试
我有一个员工“上类打卡”表,具有开始时间和结束时间属性。每位员工上下类打卡,表格类似这样: Employee_no Start time End time 16
Linux perf工具(前段时间命名为 perf_events)有几个内置的通用软件事件。其中最基本的两个是:task-clock和 cpu_clock (内部称为 PERF_COUNT_SW_CP
我的方法之一中有以下代码 ZonedDateTime current = Instant.now().atZone(ZoneId.of(AMERICA_NEW_YORK)); 我想在 JUnit 测试
我正在使用 sf::Clock 来控制循环。 我想知道是否允许我使用超过 1 个 sf::Clock,如果允许,是否所有“时钟”都将正常运行并按预期工作在所有操作系统上。 例如: sf::Clock
假设您有一个 (1) Intel/AMD x86-64 位 2 GHz 8 核处理器。 8 个内核中的每一个是否都以完整的 2 GHz 运行,或者每个内核是否以完整的 2 GHz 时钟的一部分运行(例
对于 java 8 下面的代码 1. System.out.println(LocalDateTime.now(Clock.systemDefaultZone())); 2. System.o
我有以下使用Chatterbot第三方库的代码:。当我尝试使用代码时,从Visual Studio收到如下错误:。我安装了以下程序包:。我尝试了使用Python3.9和3.11以及Chatterbot
我有以下使用Chatterbot第三方库的代码:。当我尝试使用代码时,从Visual Studio收到如下错误:。我安装了以下程序包:。我尝试了使用Python3.9和3.11以及Chatterbot
我有以下使用Chatterbot第三方库的代码:。当我尝试使用代码时,从Visual Studio收到如下错误:。我安装了以下程序包:。我尝试了使用Python3.9和3.11以及Chatterbot
我有一个相对简单的要求:我希望我在 KVM 下创建的 CentOS 客户机上的时钟从 VM 的第一次启动就与它们的 CentOS 主机同步。 在它们启动并运行后将它们与 NTP 同步很容易。但是,如果
谁能告诉我如何找到STM32F429的APB1时钟频率?以及如何计算STM32F429的波特率。 P.S...请不要告诉我引用引用手册,因为这些工作已经完成,我想告诉我 APB1 时钟频率的确切值 谢
我在 LAN 上有 5 台服务器,没有 Internet 连接。我需要他们保持时钟同步。 我可以将它们配置为 NTP 对等体,并为其中一个的本地时钟设置较高的层数。这样,其他四个就会与该时钟同步。 我
让我们假设我们有许多系统连接在本地网络中并且没有连接到互联网。确保每个时钟同步的最佳方法是什么?它们不一定要与 UTC 时间同步,但在它们之间保持同步就足够了。 我曾想过通过在其中一个系统中设置 NT
我对 clock() 有疑问在运行 32 位版本的 Debian 6.0.3 的机器上。它似乎总是返回 0。使用 this example program 时,我得到以下输出: Calculating
我正在尝试编写一个程序来比较快速排序和插入排序函数所花费的时间,具体取决于数组中元素的数量。这是我想出的代码: #include #include #include //prototypes o
我是一名优秀的程序员,十分优秀!