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

朴素方式

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

输入

1
cin >> a >> b;

输出

1
cout << a << b;

借助 C 语言优势

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

输入

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

输出

1
printf("%d%d", a, b);

使用 C++ 自身优势

话说 C++ 中的默认的输入输出怎么能比 C 语言还慢呢?这不,解个锁速度就上来了。

解锁

1
2
3
ios::sync_with_stdio(false);
cin.tie(nullptr);
cout.tie(nullptr);

剩下的就和默认一样使用就好了。

输入

1
cin >> a >> b;

输出

1
cout << a << b;

快读 / 快写

祖传信息学竞赛快读快写(卡常)方法。优点就不多介绍了。

输入

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
inline int read() {
register int x = 0, inv = 1;
register char c = getchar();

while (c < '0' || c > '9') {
if (c == '-') {
inv = -1;
}

c = getchar();
}

while (c >= '0' && c <= '9') {
x = x * 10 + c - '0';
c = getchar();
}

return x * inv;
}

输出

1
2
3
4
5
6
7
8
9
10
11
12
inline void write(register int 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
#include <iostream>
#include <random>

const unsigned int NUMBER_SIZE = 1e7;

int main() {

std::mt19937 rng(std::random_device{}());
for (unsigned int i = 1; i <= NUMBER_SIZE; ++i) {
std::cout << rng() << std::endl;
}

return 0;
}

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

文件大小:117413596117413596 字节

编译选项

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

测试平台信息如下:

1 号测试机2 号测试机
CPUi5-8400ARM Cortex-A57
内存DDR4 3200Mhz64-bit LPDDR4 25.6GB/s
硬盘Intel 760pSanDisk Extreme Pro 64GB V30
GCC 版本10.2.0 (Rev10, MSYS2)7.5.0 (Ubuntu 18.04)

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