Windows 和 Linux 下 clock 函数对 scanf 函数的测量问题
这个问题的来由是《算法竞赛入门经典(第 2 版)》P27:
输入 "20",按 Enter 之后...键盘输入的时间也被计算在内——这确实是程序启动之后才进行的。
所以,作者建议使用 echo
命令来消除键盘输入的影响:
在 Windows 命令行下执行
echo 20|abc
,操作系统会自动把 20 输入,其中 abc 是程序名。Linux 下需要输入echo 20|./abc
,因为在默认情况下,当前目录不在可执行文件的搜索路径中。
根据我的猜测,在 Windows 下使用 clock()
函数,scanf
函数的输入时间是要被算进去的,而在 Linux
环境下,scanf
的时间则会被省去。
下面就来测试一下。
测试程序如下:
#include<stdio.h>
#include<time.h>
int main(void)
{
const int MOD = 1000000;
int n, S = 0;
scanf("%d", &n);
for (int i = 1; i <= n; i++) {
int factorial = 1;
for (int j = 1; j <= i; j++)
factorial = (factorial * j % MOD);
S = (S + factorial) % MOD;
}
printf("%d\n", S);
printf("Time used = %.2f\n", (double)clock() / CLOCKS_PER_SEC);
return 0;
}
在 Windows 下测试如下:
在 Ubuntu 20.04 下测试如下:
由此,可以知道,前面的猜测是正确的。但是具体原因是为什么,这个就需要去看两个操作系统的具体实现了。暂时没有这个必要。
然后,我们使用 echo
命令再试一下:
Windows 和 Linux 下 clock 函数对 scanf 函数的测量问题
http://fanyfull.github.io/2021/11/27/Windows-和-Linux-下-clock-函数对-scanf-函数的测量问题/