C++ 输入输出性能对比测试

朴素方式

这种方法也是最朴素(应该是 C++ 最初就学习的吧)的一种输入与输出

1
2
cin >> a >> b;
cout << a << b;

借助 C 语言优势

这在信息学竞赛中就比较常见了,作为 C 语言的输入输出,自然要比未解锁同步流的 cin 更快一些。

1
2
scanf("%d%d", &a, &b);
printf("%d%d", a, b);

使用 C++ 自身优势

C++ 中的默认的输入输出怎么能比 C 语言还慢呢?这不,取消与 C 的输入输出同步流之后速度就上来了。

1
2
3
4
5
6
ios::sync_with_stdio(false); // 取消同步
cin.tie(nullptr); // 取消 cin 与 cout 的绑定
cout.tie(nullptr);

cin >> a >> b;
cout << a << b;

但需注意解锁同步流之后就不能与 C 的输入输出混用了。

快读 / 快写

竞赛中常见的快读快写(卡常)方法。

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
template <typename T>
void read(T &x) {
x = 0;
T inv = 1;
auto ch = getchar();
while (!isdigit(ch)) {
if (ch == '-') {
inv = -1;
}
ch = getchar();
}
while (isdigit(ch)) {
x = x * 10 + ch - '0';
ch = getchar();
}
x *= inv;
}

template <typename T>
void write(T x) {
if (x < 0) {
putchar('-');
x = -x;
}

if (x > 9) {
write(x / 10);
}

putchar(x % 10 + '0');
}

性能对比

测试用的随机生成代码如下:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
#include <climits>
#include <ctime>
#include <iostream>
#include <random>

using namespace std;

constexpr int MAX_N = (int)1e7;

int main() {
mt19937 rng((int64_t)time(nullptr));
uniform_int_distribution<long long> dist(INT64_MIN, INT64_MAX);

for (int i = 1; i <= MAX_N; ++i) {
cout << dist(rng) << '\n';
}

return 0;
}

先随机生成 10710^{7}long long 类型的数据进行测试。

文件大小:213796511213796511 字节

编译选项:

1
g++ -std=c++11 -O2 -march=native

测试平台信息如下:

1 号测试机2 号测试机3 号测试机
CPUi5-8400NVIDIA Tegra X1 (ARM Cortex-A57)i5-7500
硬盘Intel 760pSanDisk Extreme Pro 64GBIntel Optane 16G
GCC 版本10.2.0 (Rev10, MSYS2)7.5.0 (Ubuntu 18.04)gcc version 9.2.0 (tdm64-1)

1 号测试机

读入 (s)输出 (s)
朴素方式15.02815.02839.00639.006
C 语言6.4296.4293.1373.137
C++ 解锁2.3362.33639.29339.293
快读 / 快写2.8032.8032.8522.852

2 号测试机

读入 (s)输出 (s)
朴素方式11.03511.03575.73175.731
C 语言4.1684.1684.8554.855
C++ 解锁3.7533.75368.04068.040
快读 / 快写1.2541.2542.2192.219

3 号测试机

读入 (s)输出 (s)
朴素方式29.1929.1964.4564.45
C 语言11.2111.217.367.36
C++ 解锁4.0484.0487.317.31
快读 / 快写5.7665.7667.0047.004
bmyjacks 爱发电 爱发电
bmyjacks Patreon Patreon
  • 本文作者: bmyjacks
  • 本文链接: https://www.bmyjacks.cn/cpp/io/
  • 版权声明: 本博客所有文章除特别声明外,均采用 BY 许可协议。转载请注明出处!