序:
以前在一篇關於vector的push_back和resize()等方式讀取數據的效率對比中,咱們發現最快的是經過讀入優化。此次將測試四種讀入方式的效率對比:
兩種讀入優化,scanf與fscanf。
測試數據採用隨機生成的10000000個int型整數,在windows環境下運行。
測試時間由time.h中的函數計算。算法
四種讀取方式:windows
int input;
inline void read1(int &curr)
{
static char c;
c = getchar();
while(c < '0' || c > '9') c = getchar();
while(c >= '0' && c <= '9')
{
curr = curr*10+c-'0';
c = getchar();
}
return ;
}
inline void read2()
{
static char c;
//int input = 0;
input = 0;
c = getchar();
while(c < '0' || c > '9') c = getchar();
while(c >= '0' && c <= '9')
{
input = input*10+c-'0';
c = getchar();
}
//return input;
return ;
}
void Init1()//傳地址
{
freopen("test.in", "r", stdin);
int n = 0, i;
int startTime = clock();
read1(n);
for(unsigned i = 0; i != n; ++i)
{
read1(m[i]);
}
int endTime = clock();
ans[1] += (double)(endTime-startTime)/CLOCKS_PER_SEC;
//cout << "Totle Time : " << (double)(endTime-startTime)/CLOCKS_PER_SEC << endl;
fclose(stdin);
}
void Init2()//利用全局變量
{
freopen("test.in", "r", stdin);
//freopen("test.out", "w", stdout);
int n = 0, i, j;
int startTime = clock();
read2();
n = input;
for(unsigned i = 0; i != n; ++i)
{
read2();
m[i] = input;
}
int endTime = clock();
ans[2] += (double)(endTime-startTime)/CLOCKS_PER_SEC;
//cout << "Totle Time : " << (double)(endTime-startTime)/CLOCKS_PER_SEC << endl;
fclose(stdin);
//fclose(stdout);
}
void Init3()//文件讀入
{
int i, n;
FILE *fp = fopen("test.in", "rb");
int startTime = clock();
fscanf(fp, "%d", &n);
for(unsigned i = 0; i != n; ++i)
{
fscanf(fp, "%d", &m[i]);
}
int endTime = clock();
ans[3] += (double)(endTime-startTime)/CLOCKS_PER_SEC;
//cout << "Totle Time : " << (double)(endTime-startTime)/CLOCKS_PER_SEC << "s" <<endl;
fclose(fp);
}
void Init4()//普通
{
int i, n;
freopen("test.in", "r", stdin);
int startTime = clock();
scanf("%d", &n);
for(unsigned i = 0; i != n; ++i)
{
scanf("%d", &m[i]);
}
int endTime = clock();
ans[4] += (double)(endTime-startTime)/CLOCKS_PER_SEC;
//cout << "Totle Time : " << (double)(endTime-startTime)/CLOCKS_PER_SEC << "s" <<endl;
fclose(stdin);
}
很顯而後兩種相對較慢,因此分兩組進行測試:(1,2)和(3,4)。markdown
對於兩種讀入優化,咱們的測試方法是循環50次算總時間與平均時間。
結果以下:
看來相比於傳地址,設置一個全局變量仍是更快一些。平均快18ms。函數
對於3,4的讀入,咱們循環10次。
結果以下:
38.773s
37.575s
看得出相比於文件讀入,scanf仍是更勝一籌。測試
那麼小數據哪?優化
測試5000個int型整數的讀入時間(循環10次)。
結果以下:
ui
結果依然。spa
100個(10次)。
忽然fscanf變得很快。code
總而言之,小數據讀入優化並無什麼用,當總數據超過百萬的時候會體現出較大差距
(100000*10的時候:
0.059000 0.005900
0.057000 0.005700
0.393000 0.039300
0.372000 0.037200)讀入時間相差300+ms
十萬時是30+ms。若達到千萬那麼前兩種只是後兩種的零頭,差距巨大(3.3s)。
以此可見,讀入越大的數據的時候讀入優化越重要,一個讀入優化可能就能將TLE的程序AC(前提是你算法是對的…)。圖片
箜瑟_qi 2017.04.15 14:19