ACM学习历程3——C与C++输入输出效率的问题

在上面一个博文中介绍了在算法设计大赛中会用到的各类输入输出形式,涉及到的主要语句是C中的scanfprintf以及C++中的cincout。事实上,在某些编程题中,有时会出现Time Limited的错误。当出现这种错误时,原因无非以下几种:程序中出现了死循环使得程序无法在规定的时间内完成;算法设计的过于复杂,使用了过多的循环使得程序步执行的次数过多;不合理语句的使用,包括输入输出语句等等。这里说说CC++的输入输出效率,在不做任何修改的情况下,CC++的效率是不一样的,先来做个简单的测试。

用下面的代码生成100000个测试数据,数据保存在Data.in文件中。

#include<iostream>
#include<fstream>
using namespace std;
int main()
{
    ofstream fout("Data.in");
    for(int i=0; i<100000; i++)
        fout<<i<<endl;
    fout.close();
    return 0;
}

Windows下简单的测试一下,CC++读取耗时:

C++

#include<iostream>
#include<fstream>
#include<ctime>
using namespace std;
int main()
{
    int start = clock();
    int num;
    freopen("Data.in","r",stdin);//重定向
    while(cin >> num)
    {

    }
    printf("%.3lf\n",double(clock()-start)/CLOCKS_PER_SEC);
    fclose(stdin);
    return 0;
}

执行以上程序,cin读取这100000个数据的时间约为0.425秒。

C:

#include<fstream>
#include<ctime>
#include<cstdio>
using namespace std;
int main()
{
    int start = clock();
    int num;
    freopen("Data.in","r",stdin);//重定向
    while(scanf("%d",&num)!=EOF)
    {

    }
    printf("%.3lf\n",double(clock()-start)/CLOCKS_PER_SEC);
    fclose(stdin);
    return 0;
}

执行以上程序,scanf读取这100000个数据的时间约为0.03秒。

当然,上面两段代码的执行时间在我自己的电脑上测试大概就是这个样子,实际的执行时间跟计算机的性能有关系同时也跟编译器有关,我说使用的编译器是Dev-C++4.9.9.1版本。但是不管怎么说C的输入确实比C++要快得多。那是不是C++的输入速度就一定比C慢呢?后来我知道了C++有一条语句:std::ios::sync_with_stdio(false)可以加快输入速度,我们先加入这条语句到上面的第一个测试代码中,看看时间是否会变快。

#include<iostream>
#include<fstream>
#include<ctime>
using namespace std;
int main()
{
    int start = clock();
    int num;
    freopen("Data.in","r",stdin);//重定向
    std::ios::sync_with_stdio(false);
    while(std::cin >> num)
    {

    }
    printf("%.3lf\n",double(clock()-start)/CLOCKS_PER_SEC);
    fclose(stdin);
    return 0;
}

运行时间0.136秒,看来时间确实变快了一些。原因何在,在默认情况,cinstdin总是保持同步的,也就是说这两种方法可以混用,而不必担心文件指针混乱,同时coutstdout也一样,两者混用不会出现输出顺序错乱的问题。正因为这个兼容性的特性,导致cin有许多额外的开销,使用std::ios::sync_with_stdio(false)语句这样就可以取消cinstdin的同步了,此时cin的效率也会相应的提升一些。此外在Cscanfprintf是格式化的输入输出效率较高,C++中的cincout是输入流和输出流,虽然在使用的过程中我们可以不管数据的类型但是效率低一点。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值