序:
在上文中對比了四種讀入方式的效率,此次將對比三種輸出方式的效率。
三種方式分別是:printf(),cout,輸出優化(字符輸出)。
測試時間依然適用time.h的庫函數。ios
輸出代碼:ruby
inline void print(int curr)//輸出優化,遞歸到最高位,依次輸出
{
if(curr > 9) print(curr/10);
putchar(curr%10+'0');
return ;
}
void print1()
{
freopen("test1.out", "w", stdout);
int i;
int startTime = clock();
for(unsigned i = 0; i != n; ++i)
{
printf("%d ", m[i]);
}
int endTime = clock();
ans[1] += (double)(endTime-startTime)/CLOCKS_PER_SEC;
fclose(stdout);
return ;
}
void print2()
{
freopen("test2.out", "w", stdout);
int i;
int startTime = clock();
for(unsigned i = 0; i != n; ++i)
{
cout << m[i] << " ";
}
int endTime = clock();
ans[2] += (double)(endTime-startTime)/CLOCKS_PER_SEC;
fclose(stdout);
return ;
}
void print3()
{
freopen("test3.out", "w", stdout);
ios::sync_with_stdio(false);
int i;
int startTime = clock();
for(unsigned i = 0; i != n; ++i)
{
print(m[i]);
putchar('\0');
}
int endTime = clock();
ans[3] += (double)(endTime-startTime)/CLOCKS_PER_SEC;
fclose(stdout);
return ;
}
(如下數據爲總時間與平均時間,單位(s))
輸出10000*50(次)int型整數。(50萬)
結果以下:
0.157000 0.003140
0.122000 0.002440
0.048000 0.000960
速度的差距是30倍左右。markdown
輸出100000*50(次)int型整數:(500萬)
1.384000 0.027680
1.200000 0.024000
0.433000 0.008660函數
很奇怪的是printf()竟然尚未cout快。
並且putchar也慢了不少(難道是遞歸次數太多的緣由?)測試
再使用一個優化:將全部空格按轉義字符(‘\0’)輸出:
通過屢次測試,速度相比於直接輸出」 「要快10%左右。
1.181000 0.023620
1.048000 0.020960
0.410000 0.008200優化
因爲出現printf()和cout混用,關閉同步。ui
ios::sync_with_stdio(false);
可是發現cout的時間並無所以減小。spa
將關閉同步的代碼改爲這樣:code
ios_base::sync_with_stdio(false);
通過屢次測試,咱們驚奇地發現cout的時間竟然穩定在了0.9s:
0.898000 0.017960
看來關閉同步對於cout是個更好的選擇。遞歸
總而言之,對大量數據的輸出輸出優化絕對是當仁不讓的選擇(快1倍多),小數據快的更多(幾十倍),可是差距並不大。
如何選擇,具體狀況具體分析。
箜瑟_qi 2017.04.15 17:09