You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何在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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.05.25 03:31:37