cin与scanf cout与printf效率问题

  在竞赛中,遇到大数据时,往往读文件成了程序运行速度的瓶颈,需要更快的读取方式。相信几乎所有的C++学习者都在cin机器缓慢的速度上栽过跟头,于是从此以后发誓不用cin读数据。还有人说Pascal的read语句的速度是C/C++中scanf比不上的,C++选手只能干着急。难道C++真的低Pascal一等吗?答案是不言而喻的。一个进阶的方法是把数据一下子读进来,然后再转化字符串,这种方法传说中很不错,但具体如何从没试过,因此今天就索性把能想到的所有的读数据的方式都测试了一边,结果是惊人的。

这里写图片描述

从上面可以看出几个问题:

1. Linux平台上运行程序普遍比Windows上快;

2. Windows下VC编译的程序一般运行比MINGW(MINimal Gcc for Windows)快;

3. VC对cin取消同步与否不敏感,前后效率相同。反过来MINGW则非常敏感,前后效率相差8倍;

4. read本是linux系统函数,MINGW可能采用了某种模拟方式,read比fread更慢。

  在ACM里,经常出现数据集超大造成 cin TLE的情况。这时候大部分人(包括原来我也是)认为这是cin的效率不及scanf的错,甚至还上升到C语言和C++语言的执行效率层面的无聊争论。其实像上文所说,这只是C++为了兼容而采取的保守措施。我们可以在IO之前将stdio解除绑定,这样做了之后要注意不要同时混用cout和printf之类。

cin cout效率没scanf printf高为何用 ,主要有以下几个原因:

1. 流输入输出对于基本类型来说使用很方便,不用手写格式控制字符串;

2. 对于标准库的一些class来说,显然重载操作符也比自己写格式控制字符串要方便很多;

3. 对于复杂的格式可以进行自定义操作符;

4. 可读性更好(这个很多人有不同意见,见仁见智了)。

转自:https://blog.csdn.net/l2580258/article/details/51319387

猜你喜欢

转载自blog.csdn.net/daaikuaichuan/article/details/80719556