三种输出方式的效率对比

序:
在上文中对比了四种读入方式的效率,这次将对比三种输出方式的效率。
三种方式分别是:printf(),cout,输出优化(字符输出)。
测试时间依然适用time.h的库函数。


输出代码:

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倍左右。

输出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混用,关闭同步。

ios::sync_with_stdio(false);

但是发现cout的时间并没有因此减少。

将关闭同步的代码改成这样:

ios_base::sync_with_stdio(false);

经过多次测试,我们惊奇地发现cout的时间居然稳定在了0.9s:
0.898000 0.017960
看来关闭同步对于cout是个更好的选择。


总而言之,对大量数据的输出输出优化绝对是当仁不让的选择(快1倍多),小数据快的更多(几十倍),但是差距并不大。
如何选择,具体情况具体分析。

箜瑟_qi 2017.04.15 17:09

  • 1
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值