RDBUF vs Getline vs ">>"

rdbuf vs getline vs ">>"

本文关键字:gt vs Getline RDBUF      更新时间:2023-10-16

我想从文本文件加载映射(如果你能想出任何其他方法将映射加载到数组,我愿意接受任何新的方法)。文本文件中所写的内容与此类似,但规模稍大。

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. 使用>>运算符逐个读取

我的问题是,从冲头的使用和速度来看,上述哪种方式(或任何其他方式(如果可用))更好。注意:天气或不使用rdbuf()是一个好方法。我希望能很好地比较不同的字符串分割方式,例如将文本分割为与空白有关的单词。

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

您没有足够的数据来通过您提到的任何方法对性能产生重大影响。换句话说,把注意力集中在程序的正确性和健壮性上,然后再回来优化那些速度较慢的部分。

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

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

我建议在使用rdbuf之前先使用istream::read。对于这两种情况,我建议读取预分配的内存区域,即数组,或者如果使用字符串,则在构造字符串时在字符串中保留较大空间。您不希望std::string数据的重新分配会减慢程序速度。

通过getline()逐个读取。

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

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

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

更改数据格式

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

二进制数据需要注意的一点是,它很难读取和修改。

优化

  1. 不要。专注于完成项目:正确而稳健
  2. 不要。通常,您获得的时间浪费在等待I/O或用户。开发时间是昂贵的,不必要的优化是对开发时间的浪费,因此是对金钱的浪费
  3. 配置文件您的可执行文件。优化占用最多的零件执行时间
  4. 在更改代码之前减少需求/功能
  5. 在更改代码之前优化设计或体系结构
  6. 在更改代码之前更改编译器优化设置
  7. 更改数据结构&用于缓存优化的对齐
  8. 如果程序绑定了I/O,则优化I/O
  9. 减少执行流中的分支/跳转/更改