C语言times()函数是否不会覆盖传入的struct tms参数?
问题根源:值传递导致外部变量未更新
你猜的没错!问题就出在函数参数的传递方式上——你的get_clock用的是值传递,函数内部修改的只是参数的临时副本,根本不会影响到你在外面定义的st_time、en_time这些变量,所以后续测量的差值自然都一样。
具体分析原函数的问题
看一下你写的函数:
void get_clock(clock_t real_time, struct tms cpu_time){ real_time = times(&cpu_time); }
这里的real_time和cpu_time都是形参,它们是调用函数时传入的实参的一份拷贝。当你在函数里给real_time赋值时,只是修改了这个拷贝的值,函数执行完毕后,这个拷贝就被销毁了,外面的st_time、st_cpu完全没被改动。这就导致每次调用get_clock后,你的起始/结束时间变量都还是初始值,差值当然不会变化。
两种修复方案
方案1:使用指针传递参数
把函数改成接受指针类型的参数,这样就能直接修改外部变量的内存值:
#include <sys/times.h> // 确保包含头文件 void get_clock(clock_t *real_time, struct tms *cpu_time){ // 通过指针访问并修改外部变量 *real_time = times(cpu_time); }
调用的时候需要传递变量的地址:
clock_t st_time; clock_t en_time; struct tms st_cpu; struct tms en_cpu; // 记录起始时间 get_clock(&st_time, &st_cpu); // 执行你需要测量的代码... // 记录结束时间 get_clock(&en_time, &en_cpu);
方案2:返回clock_t值(更简洁)
如果觉得指针有点繁琐,可以让函数直接返回times()的结果,同时用指针传递struct tms:
#include <sys/times.h> clock_t get_clock(struct tms *cpu_time){ return times(cpu_time); }
调用方式更直观:
st_time = get_clock(&st_cpu); // 执行代码... en_time = get_clock(&en_cpu);
补充:计算时间差值
拿到起始和结束时间后,你可以这样计算实际耗时:
#include <unistd.h> // 用于sysconf // 真实时间差(时钟滴答数) clock_t real_diff = en_time - st_time; // 用户态CPU时间差 clock_t usr_diff = en_cpu.tms_utime - st_cpu.tms_utime; // 内核态CPU时间差 clock_t sys_diff = en_cpu.tms_stime - st_cpu.tms_stime; // 转换为秒(_SC_CLK_TCK是每秒的时钟滴答数) double real_sec = (double)real_diff / sysconf(_SC_CLK_TCK); double usr_sec = (double)usr_diff / sysconf(_SC_CLK_TCK); double sys_sec = (double)sys_diff / sysconf(_SC_CLK_TCK);
内容的提问来源于stack exchange,提问作者Whazz
相关产品推荐
相关产品推荐

