一、sync_with_stdio()

这个函数是一个“是否兼容stdio”的开关,C++为了兼容C,保证程序在使用了std::printf和std::cout的时候不发生混乱,将输出流绑在了一起。

在IO之前将stdio接触绑定,可以大大提高IO效率。在操作大数据时,cin,cout的速率也能很快了。

现在,我们通过比较解除绑定前后cin,printf的速率来实际体验下sync_with_stdio()的作用。

首先,我们先产生1000万个随机数作为测试数据。然后,分别用cin,scanf来读取数据,比较其效率

  • data.cpp,产生1000万个随机数存贮在data.txt中,大概55M左右
 /*
本程序实现的功能:
生成1000万个可能重复的随机数,用作测试数据
并计算生成这些数据所用的时间
*/
#include <iostream>
#include <ctime>
using namespace std;
#define SELF_RAND_MAX 0x7FFFFFFF
int main()
{ clock_t start_time = clock(); srand(unsigned(time())); const int MAX = ;
const int MIN = ; freopen("data.txt","w",stdout); for(int i = ; i < ; ++i){
unsigned long data = rand() % (MAX - MIN + ) + MIN;
cout << data << ' ';
}
fclose(stdout);
freopen("time.txt","w",stdout);
cout << endl
<< "---the end---"
<< endl;
//CLOCKS_PER_SEC控制精度,在windows环境下是1000,linux下是多少?
//简单地说windows下是毫秒级,而linux下好像是纳秒级
cout << "elapsed time:" << double(clock() - start_time) / CLOCKS_PER_SEC
<< 's' << endl;
fclose(stdout);
}
  • test.cpp, 测试程序,读取data.txt中的数据,比较cin, printf的效率
 #include <iostream>
#include <ctime>
using namespace std; void scanf_read();
void cin_read(); const int MAXIN = ;
int numbers[MAXIN]; int main () {
iostream::sync_with_stdio(false);
cin.tie(nullptr);
cout.tie(nullptr);
clock_t start_time = clock();
//do something
scanf_read();
//cin_read();
cout << "read time:"
<< double(clock() - start_time) / CLOCKS_PER_SEC
<< endl;
} void scanf_read() {
freopen("data.txt","r",stdin);
for (int i = ; i < MAXIN; ++i) {
scanf("%d", &numbers[i]);
}
} void cin_read() {
freopen("data.txt", "r", stdin);
for (int i = ; i < MAXIN; ++i) {
cin >> numbers[i];
}
}

运行结果(win7 32 i3处理器,mingw 4.9.2):

  • 解除绑定前

通过scanf来读取1000万个随机数需要的时间:16.323s

通过cin来读取1000万个随机数需要的时间:24.361s

我们可以看到,cin的读取时间整整比scanf满了8秒。

  • 解除绑定后

通过scanf读取1000万个数据需要的时间:16.29s。

通过cin来读取1000万个随机数需要的时间:4.946s,我们看到cin的读取时间整整缩短了20秒,比scanf的读取时间还快乐10秒。

  • 解除绑定,并cin.tie(nullptr), cout.tie(nullptr)

通过cin来读取1000万个随机数需要的时间:4.861s,数值上来看,比只解除绑定好像快了一丢丢。但效果不明显。这里提到了tie()函数,下面就来看看tie()函数。

二、tie()

tie()用来绑定stream,空参数则返回当前的输出流指针。

直接上程序,看看其是如何表现的。

  • tie.cpp, 测试tie的实现效果。
 #include <iostream>
#include <fstream>
using namespace std; int main () {
ostream *prevstr;
ofstream ofs; ofs.open("test.txt");
cout << "Output to the screen" << endl; *cin.tie() << "Output to the screem, too" << endl; //null parameters, return the default output stream, i.e. cout prevstr = cin.tie(&ofs); // cin bind to ofs, and return the pre output stream, i.e. cout
*cin.tie() << "Output to the file, test.txt" << endl; *cin.tie(prevstr) << "Output to the file, too";
*cin.tie() << "Output to the screen, again"; ofs.close(); return ; }

运行结果(环境同一):

控制台输出:

Output to the screen
Output to the screen, too
Output to the screen, again

文件输出:

对照程序结果,我们可以很清楚的明白tie()的作用。就不多讲了。

PS:Open live writer怎么添加“代码插入”插件啊!!!看见有人用SyntaxHighlighter,自己折腾半天也没把SyntaxHighlighter和Open live writer整合在一起,傻傻的在网页上编辑。

1, sync_with_stdio(), tie()的应用的更多相关文章

  1. cin.tie与sync_with_stdio加速输入输出

    在LeetCode上练习习题的时候每次AC之后都会去看别人的代码,几乎每次都能遇到cin.tie与sync_with_stdio.类似这样: static auto x = [](){ std::io ...

  2. 关于ios::sync_with_stdio(false);和 cin.tie(0)加速c++输入输出流

    原文地址:http://www.hankcs.com/program/cpp/cin-tie-with-sync_with_stdio-acceleration-input-and-output.ht ...

  3. std::ios::sync_with_stdio和tie()——给cin加速

    平时在Leetcode上刷题的时候,总能看到有一些题中最快的代码都有这样一段 static const auto init = []() { std::ios::sync_with_stdio(fal ...

  4. C++输入输出流加速器,关闭同步流,ios::sync_with_stdio(false)和 cin.tie(0)

    leetcode练习时,总会发现运行时间短的代码都会有类似: static int x=[](){ std::ios::sync_with_stdio(false); cin.tie(NULL); ; ...

  5. sync_with_stdio(false)和cin.tie(NULL)

    std::ios::sync_with_stdio(false) 这个函数相当于是否兼容stdio的开关,默认为true C++为了兼容C,保证程序在使用了std::printf和std::cout的 ...

  6. ios::sync_with_stdio(false)提高C++读写速度

    版权声明:若无来源注明,Techie亮博客文章均为原创. 转载请以链接形式标明本文标题和地址: 本文标题:ios::sync_with_stdio(false)提高C++读写速度     本文地址:h ...

  7. CF995B Suit and Tie 贪心 第十三

    Suit and Tie time limit per test 2 seconds memory limit per test 256 megabytes input standard input ...

  8. sync_with_stdio

    /* The synchronization referred to is @e only that between the standard * C facilities (e.g., stdout ...

  9. std::ios::sync_with_stdio(false);

    这句语句是用来取消cin的同步,什么叫同步呢?就是iostream的缓冲跟stdio的同步.如果你已经在头文件上用了using namespace std;那么就可以去掉前面的std::了.取消后就c ...

随机推荐

  1. 什么是core dump?(转)

    什么是Core Dump? 今天调试一个程序, 用到了core dump, 于是写出来, 记于此.什么是Core Dump?Core的意思是内存, Dump的意思是扔出来, 堆出来.开 发和使用Uni ...

  2. 微软Xbox360 E与微软Xbox360 slim Kinect套装(1TB)哪个好

    原文地址:http://product.pchome.net/digi_home_playstation_microsoft_xbox360slimkinect1tb/381793.html 微软Xb ...

  3. 68篇Hadoop博客

    http://www.cnblogs.com/smartloli/category/649544.html

  4. mget 同时获取

    mget 同时获取: http://192.168.32.81:9200/ _mget POST { "docs" :[ { "_index":"li ...

  5. Android调用系统关机与重启功能

    我是在android源码里编译的package/apps/,因为需要调用的关机接口是不对上层开放的,在eclipse里面不能调用. 我主要是介绍调用android的关机功能,因为在调试过程中,关机的一 ...

  6. 新技能get: 使用whois查询不明网址的信息

    1.站长之家-->Whois反查 http://whois.chinaz.com/ 进入whois.chinaz.com,输入要查询的网址,选择查询即可.

  7. linux命令: patch

    一. 针对单文件的patch: 我们以mkprj.sh.1和mkprj.sh两个文件为例: [root@localhost tst]# lsmkprj.sh.1  mkprj.sh 看两个文件的差异: ...

  8. [Swust OJ 772]--Friend(并查集+map的运用)

    题目链接:http://acm.swust.edu.cn/problem/772/ Time limit(ms): 1000 Memory limit(kb): 65535    Descriptio ...

  9. BZOJ 2196: [Usaco2011 Mar]Brownie Slicing( 二分答案 )

    二分答案就可以了.... ----------------------------------------------------------------------- #include<cst ...

  10. vagrant 使用方法

    0.介绍 Vagrant 是一款用来构建虚拟开发环境的工具,非常适合 php/python/ruby/java 这类语言开发 web 应用,"代码在我机子上运行没有问题"这种说辞将 ...