zer*_*ble 114 c c++ io performance
我不知道这是不是真的,但当我在其中一个问题提供网站上阅读常见问题时,我找到了一些东西,引起了我的注意:
检查输入/输出方法.在C++中,使用cin和cout太慢了.使用这些,您将保证无法通过适当的输入或输出解决任何问题.请改用printf和scanf.
有人可以澄清一下吗?真的在C++程序中使用scanf()比使用cin更快吗?如果是,那么在C++程序中使用它是一个好习惯吗?我认为这是C特定的,虽然我只是学习C++ ...
nib*_*bot 197
这是一个简单案例的快速测试:一个程序,用于读取标准输入的数字列表和所有数字的XOR.
iostream版本:
#include <iostream>
int main(int argc, char **argv) {
int parity = 0;
int x;
while (std::cin >> x)
parity ^= x;
std::cout << parity << std::endl;
return 0;
}
Run Code Online (Sandbox Code Playgroud)
scanf版本:
#include <stdio.h>
int main(int argc, char **argv) {
int parity = 0;
int x;
while (1 == scanf("%d", &x))
parity ^= x;
printf("%d\n", parity);
return 0;
}
Run Code Online (Sandbox Code Playgroud)
结果
使用第三个程序,我生成了一个包含33,280,276个随机数的文本文件.执行时间是:
iostream version: 24.3 seconds
scanf version: 6.4 seconds
Run Code Online (Sandbox Code Playgroud)
更改编译器的优化设置似乎根本没有改变结果.
因此:确实存在速度差异.
编辑:用户clyfish 指出速度差异主要是由于iostream I/O功能与CI/O功能保持同步.我们可以通过以下呼叫关闭此功能std::ios::sync_with_stdio(false);:
#include <iostream>
int main(int argc, char **argv) {
int parity = 0;
int x;
std::ios::sync_with_stdio(false);
while (std::cin >> x)
parity ^= x;
std::cout << parity << std::endl;
return 0;
}
Run Code Online (Sandbox Code Playgroud)
新结果:
iostream version: 21.9 seconds
scanf version: 6.8 seconds
iostream with sync_with_stdio(false): 5.5 seconds
Run Code Online (Sandbox Code Playgroud)
C++ iostream赢了! 事实证明,这种内部同步/刷新通常会减慢iostream i/o的速度.如果我们不混合使用cstdio和iostream,我们可以关闭它,然后iostream是最快的.
代码:https://gist.github.com/3845568
cly*_*ish 63
http://www.quora.com/Is-cin-cout-slower-than-scanf-printf/answer/Aditya-Vishwakarma
cin/的性能cout可能很慢,因为它们需要与底层C库保持同步.如果要使用C IO和C++ IO,这一点至关重要.
但是,如果您只打算使用C++ IO,那么只需在任何IO操作之前使用以下行.
std::ios::sync_with_stdio(false);
Run Code Online (Sandbox Code Playgroud)
有关这方面的更多信息,请查看相应的libstdc ++文档.
180*_*ION 42
可能scanf比使用流更快一些.虽然流提供了很多类型安全性,并且不必在运行时解析格式字符串,但它通常具有不需要过多内存分配的优点(这取决于您的编译器和运行时).也就是说,除非性能是你唯一的最终目标并且你处于关键路径,否则你应该更喜欢更安全(更慢)的方法.
Herb Sutter撰写了一篇非常好吃的文章" 庄园农场的字符串格式化 ",他详细介绍了字符串格式化程序的性能,sscanf以及lexical_cast使它们运行缓慢或快速的类型.这有点类似,可能会影响C风格IO和C++风格之间的性能.与格式化程序的主要区别往往是类型安全性和内存分配数.
Bog*_*tyr 16
我刚刚花了一个晚上在UVa Online上解决问题(Factovisors,一个非常有趣的问题,请查看):
我在提交时获得了TLE(超出时间限制).在这些解决问题的在线评判网站上,您有大约2-3秒的时间限制来处理可能用于评估您的解决方案的数千个测试用例.对于像这样的计算密集型问题,每微秒都很重要.
我正在使用建议的算法(在论坛的讨论论坛中阅读),但仍然得到TLE.
我将"cin >> n >> m"更改为"scanf("%d%d",&n,&m)"和几个微小的"couts"改为"printfs",我的TLE变成了"Accepted"!
所以,是的,它可以产生很大的不同,特别是在时间限制很短的情况下.
一般使用中的语句cin和cout看起来比C++ 中的scanf和慢printf,但实际上它们更快!
事实是:在 C++ 中,每当您使用cinand时cout,默认情况下都会发生同步过程,以确保如果您在程序中同时使用scanfand cin,那么它们都会彼此同步工作。此同步过程需要时间。因此cin,cout看起来会更慢。
但是,如果同步过程设置为不发生,cin则比 更快scanf。
要跳过同步过程,请在程序的开头添加以下代码片段main():
std::ios::sync_with_stdio(false);
Run Code Online (Sandbox Code Playgroud)
访问此网站了解更多信息。
| 归档时间: |
|
| 查看次数: |
74832 次 |
| 最近记录: |