序:
在上文中对比了四种读入方式的效率,此次将对比三种输出方式的效率。
三种方式分别是: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