如何加快从流到内存的读取速度

How to speed up reading lines from stream to memory?

本文关键字:读取 速度 内存 何加快      更新时间:2023-10-16

我在输入流中有大约1E6行(来自键盘)。我是这样读的:

int main () {
  ul n, in;
  scanf("%lu", &n);
  ul *a = new ul[n];
  while(n--){
    scanf("%lu", a+n);
  }

n是要读取的行数。ul是我在别处定义的unsigned long

澄清一下,数据是一堆整数(<1E9)由换行符(n)从键盘输入流分隔。>

这个方法可以完成任务,但是我想加快它的速度。我想过使用缓冲区读取整个流到内存和解析,但我不知道如何用c++ 11做到这一点。

我使用stdio.h读取流,因为它似乎比c++流读取器更快。否则,我更喜欢c++ 11解决方案。

我认为你可以通过编辑while循环来略微提高性能。

因为数字小于1e9,所以你可以读int,而不是uns。。在下面的代码中,我通过getc读取每个字符并将其转换为数字。注意current_number是int
为了使代码工作,你必须修改第一个 scanf("%lu", &n);通过读取 'n'来读取,即您的第一次扫描将是 scanf("%lun", &n);

while (n--) {
    int c = getc(stdin);
    int current_number = 0;
    do {
        current_number = (current_number << 1) + (current_number << 3) + (c - 48);
        c = getc(stdin);
    } while (c >= 48 && c <= 57);
    a[n] = current_number;
}

scanf 函数在处理大数据时比getc慢得多。
(current_number <<1) + (current_number <<3) 等于 current_number * 10 ,但我认为没有必要。现代编译器能够找出计算小操作的最佳方法。
祝你好运