【问题标题】:rdbuf vs getline vs ">>"rdbuf vs getline vs“>>”
【发布时间】:2016-03-31 14:26:43
【问题描述】:

我想从文本文件中加载地图(如果您能想出任何其他方法将地图加载到数组中,我愿意接受任何新事物)。 文本文件中写的内容是这样的,但规模有点大。

6 6 10 (Nevermind what this number "10" is but the two other are the map size.)
1 1 1 1 1 1
1 0 2 0 0 1
1 0 0 0 2 1
1 2 2 0 0 1
1 0 0 0 0 1
1 1 1 1 1 1

其中 1 是边界,0 是空的,2 是墙。 现在我想阅读这个文本文件,但我不确定哪种方式最好。 我现在想到的是:

  1. 在字符串流中一次读取整个文本文件,稍后通过 rdbuf() 将其转换为字符串,然后拆分字符串并将其放入数组中。
  2. 通过 getline() 逐个读取。
  3. 使用 >> 运算符逐个读取。

我的问题是,在 ram 使用和速度方面,哪种方式(或任何其他方式,如果可用)更好。 注意:天气或不使用 rdbuf() 是一个好方法。我很感激在拆分字符串的不同方式之间进行很好的比较,例如将文本拆分为与空格有关的单词。

【问题讨论】:

  • 你没看过scanf吗? Using scanf() in C++ programs is faster than using cin? 。问题的答案有 istream 和 scanf 之间的比较。另外,您可以通过将std::ios_base::sync_with_stdio 设置为false 来关闭istream 的同步,但是istream,如果i 不做,istream 只会在输入较大时变慢。但不确定内存使用情况。
  • 您是否在互联网上搜索过“stackoverflow c++ 读取文件矩阵”或“stackoverflow 读取文件数组”等重复项?
  • “大一点”有多大?兆字节,还是千兆字节? 0 1 2 是唯一可能的值吗? (即固定宽度的行?)。
  • 顺便说一句,有两个性能瓶颈:1)输入(从设备读取)和 2)从文本表示转换为内部表示。除非您的数据以千兆字节为单位,否则我建议不要优化,因为与用户的任何交互都会浪费您通过优化获得的任何时间。
  • @Danny_ds 只是一点点!地图最多 20 kbs。

标签: c++ string file split string-parsing


【解决方案1】:

其中 1 是边界,0 是空的,2 是墙。现在我想阅读这个文本文件,但我不确定哪种方式最好。我现在想到的是:

您没有足够的数据通过您提到的任何方式对性能产生重大影响。换句话说,专注于程序的正确性和健壮性,然后再回来优化慢的部分。

在字符串流中一次读取整个文本文件,稍后通过 rdbuf() 将其转换为字符串,然后拆分字符串并将其放入数组中。

输入数据的最佳方法是保持输入流的流动。这通常意味着每个事务读取大量数据,而不是许多小数量的小事务。内存的搜索和处理速度比输入流快得多。

我建议在使用rdbuf 之前使用istream::read。对于任何一个,我建议读入一个 preallocated 内存区域,它可以是一个数组,或者如果使用字符串,则在构造它时在字符串中保留一个大空间。您不希望重新分配 std::string 数据会减慢您的程序。

通过 getline() 逐个读取。

由于您的数据是面向行的,这可能是有益的。您读取一行并处理这一行。好的技术开始,然而,比下面的更复杂一点,但比以前的方法简单。

使用 >> 运算符逐个读取它。

IMO,这是您应该使用的技术。该技术简单易行;使您能够处理项目的其余部分。

更改数据格式

如果你想让输入更快,你可以改变数据的格式。二进制数据,不需要翻译的数据,是最快的读取格式。它绕过了文本格式到内部表示的转换。二进制数据是内部表示。

二进制数据的一个警告是它很难读取和修改。

优化

  1. 不要。专注于完成项目:正确而稳健。
  2. 不要。通常,您获得的时间浪费在等待 I/O 或 用户。开发时间成本高昂,不必要的优化浪费开发时间,从而浪费金钱。
  3. 配置文件您的可执行文件。优化占用最多的部分 执行时间。
  4. 在更改代码之前减少要求/功能。
  5. 在更改代码之前优化设计或架构。
  6. 在更改代码之前更改编译器优化设置。
  7. 更改数据结构和对齐方式以优化缓存。
  8. 如果您的程序受 I/O 限制,请优化 I/O。
  9. 减少执行流程中的分支/跳转/更改。

【讨论】:

  • 特别是,该程序听起来像是一个迷宫跟随程序。如果输入数据很小,无论如何IO都是微不足道的。如果输入数据很大,IO 将是整个执行时间的一小部分。先用最简单的方法(即>>)做,只有必要时才考虑优化。
猜你喜欢
  • 2012-11-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2014-08-17
  • 2011-09-18
  • 1970-01-01
  • 2012-07-27
相关资源
最近更新 更多