scanf、cin及其优化、快读性能测试

为了让大家了解C++各种IO方式的性能,于是就有了这篇文章。

本次测试采取的数据均为 \(10^6\) 个不超过 \(10^8\) 随机正整数。

测试代码

cpp 复制代码
#include<bits/stdc++.h>
using namespace std;
int x;
int main(){
	freopen("test.in","r",stdin);
	freopen("test.out","w",stdout);
	double s=clock();//记录开始时间
	for(int i=1;i<=1000000;i++){
		//测试内容 
	}
	cerr<<clock()-s<<"\n";//在终端输出运行时间
	return 0;
}

输入测试

scanf

\(328\) 毫秒

无优化cin

\(577\) 毫秒

优化后cin

\(81\) 毫秒

快读(不考虑负数)

\(155\) 毫秒

输出测试

输出每一个数后换行

printf

\(989\) 毫秒

无优化cout(endl)

\(1447\) 毫秒

优化后cout(endl)

\(1386\) 毫秒

无优化cout(\n)

\(61\) 毫秒

优化后cout(\n)

\(73\) 毫秒

快写

\(105\) 毫秒

总结

输入

如果不想关闭读写同步的话就用快读,总之不要用原生的 cinscanf 处于中立。

输出

快写的优化作用比快读小得多,几乎没有。

正常的 printf 足够。

endl 换行的 cin 慢的要死,打死也不要用。

建议用 \n 换行,优化不重要。

综上所述,不关闭读写同步建议用快读+ \(\texttt{cout}\)(\n换行),关闭读写同步就无脑 cin/cout。