scanf、cin及其最佳化、快讀效能測試

xxxalq發表於2024-07-24

為了讓大家瞭解C++各種IO方式的效能,於是就有了這篇文章。

本次測試採取的資料均為 \(10^6\) 個不超過 \(10^8\) 隨機正整數。

image

測試程式碼

#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

image

\(328\) 毫秒

無最佳化cin

image

\(577\) 毫秒

最佳化後cin

image

\(81\) 毫秒

快讀(不考慮負數)

image

\(155\) 毫秒

輸出測試

輸出每一個數後換行

printf

image

\(989\) 毫秒

無最佳化cout(endl)

image

\(1447\) 毫秒

最佳化後cout(endl)

image

\(1386\) 毫秒

無最佳化cout(\n)

image

\(61\) 毫秒

最佳化後cout(\n)

image

\(73\) 毫秒

快寫

image

\(105\) 毫秒

總結

輸入

如果不想關閉讀寫同步的話就用快讀,總之不要用原生的 cinscanf 處於中立。

輸出

快寫的最佳化作用比快讀小得多,幾乎沒有。

正常的 printf 足夠。

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

建議用 \n 換行,最佳化不重要。

綜上所述,不關閉讀寫同步建議用快讀+ \(\texttt{cout}\)(\n換行),關閉讀寫同步就無腦 cin/cout。

相關文章