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-函数的测量问题/
作者
Fany Full
发布于
2021年11月27日
许可协议