当前位置: 首页 > 知识库问答 >
问题:

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

沈弘文
2023-03-14

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

int main () {
  ul n, in;
  scanf("%lu", &n);

  ul *a = new ul[n];

  while(n--){
    scanf("%lu", a+n);
  }

n是要读取的行数。ul是我在其他地方定义的无符号长

这个方法正在做的工作,但我想加快它。我想过使用缓冲区将整个流读取到内存中并进行解析,但我不知道如何使用C++11来实现这一点。

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

共有1个答案

后焕
2023-03-14

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

由于这些数字小于1e9,所以您可以读取int,而不是uns。长。在下面的代码中,我通过getc读取每个字符,并自己将其转换为number。
注意current_number是int
为了使代码工作,必须修改第一个scanf(“%lu”,&n);也通过读取'\n',即您的第一个扫描将是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<<1)+(current_number<<3)等效于current_number*10,但我认为没有必要。现代编译器能够找出计算小型运算的最佳方法。
祝你好运

 类似资料:
  • 问题内容: 该问题已清除,重要信息移至下面的答案。 我对内存管理有一些疑问。 我正在构建照片编辑应用程序。因此,保持较低的内存使用量很重要。另外,我不打算发布代码,因为在做一件特定的事情时,我不会发生大的内存泄漏。我将所有发生的一切都丢失了几KB / MB。遍历数万行代码以查找千字节并不有趣;) 我的应用使用了核心数据,许多cifilter内容,位置和基础知识。 我的第一个视图只是一个表视图,它占

  • 学习5阶段 getting start 入门 guide 指南 doc 查api 阅读源码 向开源贡献代码 你该阅读源码? 上面已经说了,第四个阶段才是读源码 原因是,必须熟练才有用,不然读了也白扯 熟练使用该模块 熟练掌握npm 熟练掌握nodejs语法 有了这个前提你就可以阅读了。 当然事情也不能绝对,没这些,你也可以看,从中找出有用的写法或者学习代码规范也是好的。 看目录结构(express

  • 问题内容: 我正在构建一个Java应用程序,该应用程序的某些部分需要每日更新。我想将频繁更新的零件作为小jar文件从服务器下载到内存。我正在将jar文件下载为字节流,而不使用URLClassloader。 如何使jar文件中的类可从我的自定义类加载器供系统类加载器使用? 我如何确保下载jar文件和加载的类永远不会缓存或写入磁盘。 问题答案: 您可以从内存中加载自定义类加载器。您可以强制系统加载器从

  • 问题内容: 通过从继承可以很容易地将Realm与类一起使用。但是我如何将包含几个字段的a保存到Swift中呢?例如 我知道文档中明确支持的类型。但是也许有一个不错的解决方法,或者甚至更好-来自领域的人可以写有关结构的未来计划。 问题答案: 我建议您使用协议,以实现所需的功能。 1)创建您的结构 2)创建您的领域对象 3)使用协议将我们的结构转换为Realm对象 4)使您的结构持久 有了这些工具,我

  • 问题内容: 我需要将一个MySQL数据库中的1亿多行记录加载到内存中。我的Java程序失败, 因为我的机器中有8GB RAM,并且我的JVM选项中给出了-Xmx6144m。 这是我的代码 任何想法如何克服这个问题? 更新 我碰到了这篇文章 ,以及根据下面的评论更新了我的代码。看来我能够以相同的- Xmx6144m量将数据加载到内存中,但是需要很长时间。 这是我的代码。 要加载前100,000行,需

  • 本文向大家介绍C#如何快速释放内存的大数组详解,包括了C#如何快速释放内存的大数组详解的使用技巧和注意事项,需要的朋友参考一下 前言 本文告诉大家如何使用 Marshal 做出可以快速释放内存的大数组。最近在做 3D ,需要不断申请一段大内存数组,然后就释放他,但是 C# 对于大内存不是立刻释放,所以就存在一定的性能问题。在博客园看到了一位大神使用 Marshal 做出快速申请的大数组,于是我就学