以下这段朴素的代码用于从标准输入中读取数据并计算每个字节的出现次数,但它非常缓慢,在我的机器上处理1GB的数据需要约1分40秒。
然而,它的缺点是更加复杂,并需要手动进行缓冲管理。
在标准C++中有没有一种读取流时逐字节进行操作的方法既像第一个片段一样简单、明显和惯用,同时又像第二个片段一样高效?
int counts[256] {0};
uint8_t byte;
while (std::cin >> std::noskipws >> byte) {
++counts[byte];
}
进行缓冲读取当然要快得多,处理1个GiB的数据不到一秒钟。
uint8_t buf[4096];
uint8_t byte;
int n;
while (n = read(0, (void *)buf, 4096), n > 0) {
for (int i = 0; i < n; ++i) {
++counts[buf[i]];
}
}
然而,它的缺点是更加复杂,并需要手动进行缓冲管理。
在标准C++中有没有一种读取流时逐字节进行操作的方法既像第一个片段一样简单、明显和惯用,同时又像第二个片段一样高效?
operator>>
一样慢。 - Brennan Vincent