rdbuf 与 getline 与“>>”

rdbuf vs getline vs ">>"

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

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() 是一个好方法。如果能对不同的字符串拆分方式进行很好的比较,例如将文本拆分为与空格有关的单词,我将不胜感激。

Where 1 is border, 0 is empty, 2 is wall. Now i want to read this text file but I'm not sure what way would be best. What i have in mind yet is:

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

Reading the whole text file at once in a stringstream and convert it to string later via rdbuf() and then split the string and put it in the array.

输入数据的最佳方法是保持输入流流畅。这通常意味着每次交易读取大块数据,而不是许多小数量的小交易。与输入流相比,内存的搜索和处理速度要快得多。

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

Reading it number by number via getline().

由于您的数据是面向行的,因此这可能会有所帮助。您读取一行并处理一行。很好的开始技术,但是,比下面的方法复杂一点,但比以前的方法简单。

Reading it number by number using the >> operator.

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

更改数据格式

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

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

正在优化

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