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是输入流和输出流,虽然在使用的过程中我们可以不管数据的类型但是效率低一点。
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++作业,本博客现在开始全面记录acm学习历程,真正的acm之路,现在开始
- ACM学习历程23——最小周期串问题
- ACM学习历程1——输入输出语句
- ACM学习历程20——竞赛中的简单数学问题之最大公约数、素数表、排列组合数
- ACM学习历程—广东工业大学2016校赛决赛-网络赛E 积木积水(最值问题 || 动态规划)
- ACM学习历程21——各种排列组合问题
- ACM学习历程16——List链表的应用之简单约瑟夫问题
- ACM学习历程—HDU 1276 士兵队列训练问题(队列)
- ACM学习历程—SNNUOJ1213 加油站问题(动态规划 || 数学)
- C++问题收藏,学习
- C++之父元旦专访(8+13个问题,关于C++的学习&使用和未来)(转帖)
- 我的C++学习历程(old)
- 一个无聊男人的疯狂《数据结构与算法分析-C++描述》学习笔记 用C++/lua/python/bash的四重实现(3) 最大子序列和问题
- More Effective C++ 阅读笔记(十)--效率问题
- 我的C++学习历程(old)
- 简述C和C++的学习历程
- 我的C++学习历程(old)
- C++学习历程
- 关于 TerminateProcess函数 在c++的进程中的学习而发现VS2008的编译安全问题
- C++之父元旦专访(8+13个问题,关于C++的学习&使用和未来)