1, sync_with_stdio(), tie()的应用
一、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()的应用的更多相关文章
- cin.tie与sync_with_stdio加速输入输出
在LeetCode上练习习题的时候每次AC之后都会去看别人的代码,几乎每次都能遇到cin.tie与sync_with_stdio.类似这样: static auto x = [](){ std::io ...
- 关于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 ...
- std::ios::sync_with_stdio和tie()——给cin加速
平时在Leetcode上刷题的时候,总能看到有一些题中最快的代码都有这样一段 static const auto init = []() { std::ios::sync_with_stdio(fal ...
- C++输入输出流加速器,关闭同步流,ios::sync_with_stdio(false)和 cin.tie(0)
leetcode练习时,总会发现运行时间短的代码都会有类似: static int x=[](){ std::ios::sync_with_stdio(false); cin.tie(NULL); ; ...
- sync_with_stdio(false)和cin.tie(NULL)
std::ios::sync_with_stdio(false) 这个函数相当于是否兼容stdio的开关,默认为true C++为了兼容C,保证程序在使用了std::printf和std::cout的 ...
- ios::sync_with_stdio(false)提高C++读写速度
版权声明:若无来源注明,Techie亮博客文章均为原创. 转载请以链接形式标明本文标题和地址: 本文标题:ios::sync_with_stdio(false)提高C++读写速度 本文地址:h ...
- CF995B Suit and Tie 贪心 第十三
Suit and Tie time limit per test 2 seconds memory limit per test 256 megabytes input standard input ...
- sync_with_stdio
/* The synchronization referred to is @e only that between the standard * C facilities (e.g., stdout ...
- std::ios::sync_with_stdio(false);
这句语句是用来取消cin的同步,什么叫同步呢?就是iostream的缓冲跟stdio的同步.如果你已经在头文件上用了using namespace std;那么就可以去掉前面的std::了.取消后就c ...
随机推荐
- 射频识别技术漫谈(23)——ISO15693的载波、调制与编码
射频识别技术中的通讯大多是主从式,主动方一般是读写器,被动方称为“卡片”或“标签”.到底是叫“卡片”还是“标签”,好像也没有严格的区分.习惯上可以从以下4个方面界定:一是形状,卡片通常体积较大,更像“ ...
- HDU 1847 Good Luck in CET-4 Everybody!
题解:巴什博弈,2^k+1=3N或2^k2=3N,所以3N为P-position,3N+r为N-position. #include <cstdio> int main(){ int n; ...
- java面试题系列12
1.面向对象的特征有哪些方面 a.抽象: 抽象就是忽略一个主题中与当前目标无关的那些方面,以便更充分地注意与当前目标有关的方面.抽象并不打算了解全部问题,而只是选择其中的一部分,暂时不用部分细节.抽象 ...
- authorization 元素(ASP.NET 设置架构)
authorization 元素(ASP.NET 设置架构) 其他版本 1(共 1)对本文的评价是有帮助 - 评价此主题 [本文档仅供预览,在以后的发行版中可能会发生更改.包含的空白主题用作占位符.] ...
- C#利用委托跨线程更新UI数据
转:http://www.2cto.com/kf/201206/136587.html 在使用C#的过程中,难免会用到多线程,而用多线程之后,线程如何与界面交互则是一个非常头疼的问题.其实不仅仅是界面 ...
- c语言: inline(gcc)
从汇编的角度看inline函数与非inline函数http://blog.csdn.net/cxmanzhao/article/details/6801786 强制内联和强制不内联http://blo ...
- Arduino M0 的一个坑(2015-12-25)
前几天收到 Arduino M0,试各项功能都正常,可就是串口监视器/串口助手不能显示程序里打印的输出,好生奇怪,各种换波特率各种PC串口程序换着试,资料不多,官方资料也只说到 Serial1 用于 ...
- 2013 Changsha Regional 一样的木板一样的气球
气球: 木板: 比赛现场: 场外: 曲线.... 除了第一题出的太慢了,总体比成都好了很多.... 自此,今年两铜收场,再接再厉,明年要有更好的成绩.
- dialog组件的jquery封装实现
(function($){ $.extend({ Dialog : function(id, options){ var option = $.extend({}, options); option. ...
- (Problem 57)Square root convergents
It is possible to show that the square root of two can be expressed as an infinite continued fractio ...
