|
|
1
2
一般来说,将大量文件读取到缓冲区中,然后解析缓冲区要比读取单个行快得多。实际的证明是逐行分析读取代码的代码,然后在大型缓冲区中分析读取代码。比较配置文件。 这个理由的基础是:
通过应用这些技术,我将一个应用程序的性能从65分钟提高到了2分钟。
减少I/O事务
保持硬盘旋转 要访问一个文件,硬盘必须将电机加速到合适的速度(这需要时间),将磁头定位到所需的磁道和扇区,并读取数据。定位磁头和升高电机是所有事务所需的开销时间。读取数据的开销很小。目标是在一个事务中读取尽可能多的数据,因为这是硬盘最有效的地方。减少事务数将减少增加电机和定位磁头的等待时间。 尽管现代计算机有数据和命令缓存,但减少数量会加快速度。更大的“有效负载”将允许更有效地使用它们的缓存,而不需要对请求进行排序的开销。
解析内存更快
数据太多会降低性能
我优化的应用程序正在从一个2GB文件中一次读取一个字节。当我将程序更改为读取1 MB的数据块时,性能大大提高。这也允许在循环展开的情况下增加性能。 希望这有帮助。 |
|
|
2
6
您的问题更多地是关于硬件、操作系统和运行时库的性能,而不是与编程语言有关。当您开始读取一个文件时,操作系统可能正在以块的形式加载文件,因为文件是以这种方式存储在磁盘上的,所以操作系统在第一次访问时完全加载每个块并对其进行缓存,而不是读取块,提取请求的数据并丢弃其余部分是有意义的。 哪个更快?一次一行还是一块?像往常一样,答案并不是你能预测到的,唯一能确定的方法就是逐行编写一个版本和一次一个块的版本,并对它们进行分析(测量每个版本需要多长时间)。 |
|
3
2
您可以尝试使用内存映射文件直接将文件映射到内存,然后使用标准C++逻辑来查找所需的模式。 |
|
|
4
1
OS(甚至你使用的C++类)可能在块中读取文件并缓存它,即使你逐行读取,以提高最小化磁盘访问的性能(从操作系统的角度来看,它将比从硬盘设备读取内存缓冲区的数据更快)。 请注意,提高程序性能的一个好方法(如果它确实是时间关键的话)是最小化对操作系统功能(管理其资源)的调用数量。 |
|
AstralHex · 矩阵乘法代码工作不正常 1 年前 |
|
|
Fishie · 作为类成员的智能指针是否仍然自动释放?[关闭] 1 年前 |
|
|
Die4Toast · 递归调用成员箭头运算符-> 1 年前 |
|
|
Anka Hanım · 关于结构和动态数组地址的问题 1 年前 |