cin/cout性能问题讨论和优化⽅法

样例解析:

在上面的两个案例中,我们发现虽然代码的逻辑是相同的,唯一的不同点在于scanf和cout的使用区别,一份超时一份ac,这是为什么呢?是否有可行的优化方法呢?

背景知识:

在 C++ 中,标准输⼊输出流如 cin 和 cout 是由 C++ 的标准库提供的;⽽在 C 语⾔
中,标准输⼊输出函数如 scanf 和 printf 是由 C 标准库提供的。由于 C++ 是从 C
发展⽽来的语⾔, C++ 标准库的输⼊输出流系统需要与 C 标准库的输⼊输出系统兼容,以
确保在同⼀程序中能够混合使⽤ C 和 C++ 的输⼊输出函数。 为了实现这种兼容性,C++
标准库默认会将 cin 、 cout 等 C++ 流对象与 stdin 、 stdout 等 C 标准库的流对
象同步在⼀起。 这种同步操作意味着每次使⽤ cin 或 cout 时,都会⾃动刷新 C 标准
库的缓冲区,以确保 C++ 和 C 的 I/O 是⼀致的。
相当于cin在实行程序时是背着包袱的,这种兼容性使得每在屏幕上输入,他就会在缓冲区刷新一次,来确保与scanf的输入输出流一致。
在默认情况下, cin 和 cout 之间存在⼀种绑定关系。这种绑定意味着,每当从
cin 读取数据时,任何之前通过 cout 输出的内容都会被强制刷新到屏幕上。 这个机
制保证了输出内容能够⽴即显⽰给⽤⼾,这对于 交互式程序⾮常有⽤。 但是,这种绑定也
可能导致性能问题,特别是在需要频繁读取⼤量数据的情况下。 这是因为每次从 cin 读
取数据都会触发⼀次输出缓冲区的刷新 ,即使实际上没有进⾏输出操作,也会浪费时间。

所以说面对竞赛这类对时间需求苛刻的情况下,我们可以采取scanf的方法来减少时间消耗。

解决方法:

那么我们若就是想要使用cout来输出,该如何解决优化呢?

cpp 复制代码
#include <iostream>
using namespace std;
int main() 
{
 ios::sync_with_stdio(false); // 取消C⻛格I/O的同步
 cin.tie(0); // 解除cin与cout的绑定
 int number;
 cout << "请输⼊⼀个数字: ";
 cin >> number;
 cout << "您输⼊的数字是: " << number << endl;
 return 0;
}

我们可以参照上述的方法,通过取消对c标准库的持续刷新,以及取消cin与scanf的绑定关系,来减少时间消耗。

ios::sync_with_stdio(false)的作用:

调用ios::sync_with_stdio(false),意味着关闭了c++标准库与c语言标准库I/O的同步关系(cin与cout不再与C语言中的stdin与stdout同步)。cin与cout不会再刷新C标准库的缓冲区,减少了时间的消耗。

适用场景:

在竞赛中,需要大量的进行输入输出的情况下,可以使用此类方法来减少时间的消耗。大约数据在1e9情况下使用,此时两者就会有较大的区别。

或者程序中只有c++标准库的输入,而没有c语言标准库的输入,此时也可以使用这类方法,这样使用更加的安全。

tips:

若程序中同时出现了c语言标准库和c++标准库,此时使用ios::sync_with_stdio(false)可能会导致输出顺序错乱。同时在解除同步之后若程序是多线程可能会存在安全问题。

cin.tie(0)的作用:

cin.tie(0)适用于解除cin与cout之间的绑定,即当cin输入内容时cout在缓冲区不会被刷新。
在默认情况下, cin 和 cout 之间存在⼀种绑定关系。这种绑定意味着,每当从 cin 读取数据
时,任何之前通过 cout 输出的内容都会被强制刷新到屏幕上。这个机制保证了输出内容能够⽴即显 ⽰给⽤⼾,这对于交互式程序⾮常有⽤。但是,这种绑定也可能导致性能问题,特别是在需要频繁读 取⼤量数据的情况下。这是因为每次从 cin 读取数据都会触发⼀次输出缓冲区的刷新,即使实际上 没有进⾏输出操作,也会浪费时间。

适用场景:

在竞赛中需要输入大量数据,解除绑定能提高运行效率。

如果程序是非交互性的,不需要实时的将内容展现给用户,解除绑定可以减少不必要的缓冲区刷新。

相关推荐
Fa_Mian_Tuan2 天前
图论基础|邻接矩阵超详细讲解(含无向/有向/带权图+完整可运行C语言代码)
c语言·数据结构·笔记·算法·图论
有点。3 天前
C++二叉树二(练习题)
数据结构·c++·算法·图论
依然鸣4 天前
PTA团体程序设计天梯赛L1真题讲解L1-077-080
开发语言·c++·算法·深度优先·pat考试·图论
oier_Asad.Chen5 天前
【洛谷题解/AcWing题解/OI学习笔记】洛谷P2868【USACO07DEC】Sightseeing Cows G(01分数规划求最大比率)
算法·图论·spfa·二分·负环
wabs6665 天前
关于图论【A*算法 | 卡码网127.骑士的攻击的思考】
数据结构·算法·图论·卡码网·广搜的改进版
依然鸣6 天前
PTA团体程序设计天梯赛L2真题讲解L2-005-008
开发语言·数据结构·c++·算法·深度优先·pat考试·图论
wabs6667 天前
关于图论【最短路径之Bellman_ford 算法(单源有限最短路)|卡码网96.城市间货物运输III的思考】
数据结构·算法·图论·卡码网·bellman_ford·单源有限最短路
wabs6668 天前
关于图论【最短路径之Bellman_ford 算法(判断负权回路)|卡码网95.城市间货物运输II的思考】
数据结构·算法·图论·bellman_ford算法·卡码网·判断负权回路
cpp_25019 天前
P1113 [USACO02FEB] 杂务
数据结构·c++·算法·动态规划·图论·拓扑排序·洛谷题解
漂流瓶jz9 天前
UVA-12174 Shuffle的播放记录 题解答案代码 算法竞赛入门经典第二版
数据结构·c++·算法·图论·滑动窗口·算法竞赛入门经典·uva