如何加快从流到内存的读取行?

时间:2014-07-29 11:03:04

标签: c++ performance c++11 input stream

我在输入流(来自键盘)中有大约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解决方案。

1 个答案:

答案 0 :(得分:0)

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

由于数字小于1e9,您可以读取 int ,而不是 uns。长的。 在下面的代码中,我通过 getc 读取每个字符,然后将其转换为数字 请注意,current_number是 int
为了编码工作,你必须修改你的第一个 scanf(“%lu”,& n); 同时阅读'\ n',即您的第一个scanf将是 scanf(“%lu \ n”,& 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&lt;&lt;&lt;&lt;&lt;&lt;&lt;&lt;&lt;&lt;&lt;&lt;&lt;&lt;&lt;&lt;&lt;&lt;&lt;&lt;&lt;&lt;&lt;&lt;&lt;&lt;&lt;&lt;&lt;&lt;&lt;&lt;&lt;&lt;&quot;现代编译器能够找出计算小型操作的最佳方法。
祝你好运