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为墙。
现在我想阅读这个文本文件,但我不确定哪种方式最好。
我的想法是:
- 在字符串流中一次读取整个文本文件,稍后通过 rdbuf() 将其转换为字符串,然后拆分字符串并将其放入数组中。
- 通过 getline() 逐个读取。
- 正在使用 >> 运算符逐个读取它。
我的问题是,在 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,这是你应该使用的技术。该技术简单易行;使您能够处理项目的其余部分。
更改数据格式
如果你想让输入更快,你可以改变数据的格式。二进制数据,不需要翻译的数据,是最快的读取格式。它绕过了将文本格式转换为内部表示的过程。二进制数据是内部表示。
二进制数据的一个警告是难以读取和修改。
正在优化
- 不要。专注于完成项目:正确和稳健。
- 不要。通常,您获得的时间都浪费在等待 I/O 或
用户。开发时间是昂贵的,不必要的优化是浪费开发时间,也是浪费金钱。
- Profile 你的可执行文件。优化占用最多的部分
执行时间。
- 在更改代码之前减少要求/功能。
- 在更改代码之前优化设计或架构。
- 更改代码前更改编译器优化设置。
- 更改数据结构和缓存优化对齐方式。
- 如果您的程序受 I/O 约束,请优化 I/O。
- 减少执行流程中的分支/跳转/变化。
我想从文本文件加载地图(如果您能想出任何其他方法将地图加载到数组,我愿意接受任何新方法)。 文本文件中写的是这样的,但规模有点大。
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为墙。 现在我想阅读这个文本文件,但我不确定哪种方式最好。 我的想法是:
- 在字符串流中一次读取整个文本文件,稍后通过 rdbuf() 将其转换为字符串,然后拆分字符串并将其放入数组中。
- 通过 getline() 逐个读取。
- 正在使用 >> 运算符逐个读取它。
我的问题是,在 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,这是你应该使用的技术。该技术简单易行;使您能够处理项目的其余部分。
更改数据格式
如果你想让输入更快,你可以改变数据的格式。二进制数据,不需要翻译的数据,是最快的读取格式。它绕过了将文本格式转换为内部表示的过程。二进制数据是内部表示。
二进制数据的一个警告是难以读取和修改。
正在优化
- 不要。专注于完成项目:正确和稳健。
- 不要。通常,您获得的时间都浪费在等待 I/O 或 用户。开发时间是昂贵的,不必要的优化是浪费开发时间,也是浪费金钱。
- Profile 你的可执行文件。优化占用最多的部分 执行时间。
- 在更改代码之前减少要求/功能。
- 在更改代码之前优化设计或架构。
- 更改代码前更改编译器优化设置。
- 更改数据结构和缓存优化对齐方式。
- 如果您的程序受 I/O 约束,请优化 I/O。
- 减少执行流程中的分支/跳转/变化。