如何在C程序中测量用户通过scanf输入数据的耗时?
如何正确测量C程序中scanf的用户输入耗时
嘿,我来帮你搞定这个问题!你的思路方向是对的,但用clock()来测量用户输入耗时其实不太准确,原因在于clock()统计的是程序占用CPU的时间——当程序在等待用户输入时,CPU是被其他进程占用的,这部分等待时间不会被clock()统计进去,所以你得到的时间会远小于实际的输入耗时,甚至可能接近0。
问题出在哪?
你的原代码里用clock()计算的是CPU为你的程序工作的时间,而用户输入的过程中,程序大多处于“等待”状态,CPU并没有在处理它的指令,所以这个计时方式完全不适合统计用户输入的实际耗时。
正确的实现方式
我们需要统计墙钟时间(也就是实际流逝的时间),不管程序是否占用CPU,时间都会正常推进。下面分几种情况给出方案:
1. 跨平台基础方案(秒级精度)
用time()函数获取系统时间,它是C标准库的函数,在任何平台都能使用,精度为秒级:
#include <stdio.h> #include <time.h> int main() { int i, array[10]; double user_input_time; time_t input_start, input_end; // 获取输入开始时的系统时间 input_start = time(NULL); for (i = 0; i < 10; i++) { scanf("%d", &array[i]); } // 获取输入结束时的系统时间 input_end = time(NULL); // 计算时间差,difftime会返回秒数 user_input_time = difftime(input_end, input_start); printf("User Input Time : %f seconds\n", user_input_time); return 0; }
2. 高精度方案(微秒/纳秒级)
如果需要更精确的计时(比如统计毫秒甚至微秒级的耗时),可以根据操作系统选择对应的高精度接口:
Linux/macOS 平台
用gettimeofday()函数,能提供微秒级精度:
#include <stdio.h> #include <sys/time.h> int main() { int i, array[10]; double user_input_time; struct timeval input_start, input_end; // 记录开始时间(精确到微秒) gettimeofday(&input_start, NULL); for (i = 0; i < 10; i++) { scanf("%d", &array[i]); } // 记录结束时间 gettimeofday(&input_end, NULL); // 计算时间差并转换为秒 user_input_time = (input_end.tv_sec - input_start.tv_sec) + (input_end.tv_usec - input_start.tv_usec) / 1000000.0; printf("User Input Time : %.6f seconds\n", user_input_time); return 0; }
Windows 平台
用QueryPerformanceCounter(),这是Windows系统提供的高精度计时接口,通常能达到纳秒级精度(取决于硬件):
#include <stdio.h> #include <windows.h> int main() { int i, array[10]; double user_input_time; LARGE_INTEGER freq, input_start, input_end; // 获取性能计数器的频率(每秒计数次数) QueryPerformanceFrequency(&freq); // 记录开始计数 QueryPerformanceCounter(&input_start); for (i = 0; i < 10; i++) { scanf("%d", &array[i]); } // 记录结束计数 QueryPerformanceCounter(&input_end); // 计算时间差并转换为秒 user_input_time = (double)(input_end.QuadPart - input_start.QuadPart) / freq.QuadPart; printf("User Input Time : %.6f seconds\n", user_input_time); return 0; }
总结
- 如果只需要粗略的秒级统计,
time()足够简单且跨平台; - 如果需要高精度计时,根据你的操作系统选择对应的接口;
- 绝对不要用
clock()来测量包含用户等待的耗时,它只统计CPU工作时间,完全不符合你的需求。
内容的提问来源于stack exchange,提问作者Jorvis
相关产品推荐
相关产品推荐

