您的位置:首页 > 编程语言 > C语言/C++

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

2016-08-22 20:54 357 查看
在上面一个博文中介绍了在算法设计大赛中会用到的各类输入输出形式,涉及到的主要语句是C中的scanf和printf以及C++中的cin和cout。事实上,在某些编程题中,有时会出现Time
Limited的错误。当出现这种错误时,原因无非以下几种:程序中出现了死循环使得程序无法在规定的时间内完成;算法设计的过于复杂,使用了过多的循环使得程序步执行的次数过多;不合理语句的使用,包括输入输出语句等等。这里说说C和C++的输入输出效率,在不做任何修改的情况下,C和C++的效率是不一样的,先来做个简单的测试。
用下面的代码生成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下简单的测试一下,C和C++读取耗时:

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秒,看来时间确实变快了一些。原因何在,在默认情况,cin与stdin总是保持同步的,也就是说这两种方法可以混用,而不必担心文件指针混乱,同时cout和stdout也一样,两者混用不会出现输出顺序错乱的问题。正因为这个兼容性的特性,导致cin有许多额外的开销,使用std::ios::sync_with_stdio(false)语句这样就可以取消cin于stdin的同步了,此时cin的效率也会相应的提升一些。此外在C中scanf和printf是格式化的输入输出效率较高,C++中的cin和cout是输入流和输出流,虽然在使用的过程中我们可以不管数据的类型但是效率低一点。
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签:  C++ 算法 STL c语言 acm