繁体   English   中英

用C ++读取文件

[英]Reading a file in C++

我正在编写应用程序来监视文件,然后匹配该文件中的某些模式。 我想知道用C ++读取文件最快的方法是逐行读取更快,读取文件块更快。

您的问题更多是关于硬件,操作系统和运行时库的性能,而不是与编程语言有关。 当您开始读取文件时,由于文件是以这种方式存储在磁盘上的,因此操作系统可能无论如何都以块的形式加载文件,这对于操作系统来说,在首次访问时完全加载每个块并进行缓存而不是读取块是有意义的,提取请求的数据并丢弃其余数据。

哪个更快? 一次一行还是一行? 与这些事情一样,答案并不是您可以预测的,要确定的唯一方法就是编写逐行版本和一次块的版本并对其进行概要分析(测量其持续时间)。每个版本)。

您可以尝试使用内存映射文件将文件直接映射到内存,然后使用标准C ++逻辑查找所需的模式。

通常,将大量文件读入缓冲区,然后解析缓冲区要比读取单独的行快得多。 实际的证明是先逐行读取配置文件代码,然后再在大型缓冲区中读取配置文件代码。 比较配置文件。

这种辩解的基础是:

  • 减少I / O交易
  • 保持硬盘旋转
  • 解析内存更快

通过应用这些技术,我将一个应用程序的性能从65分钟降低到2分钟。

减少I / O交易
减少I / O事务导致对操作系统的调用很少,从而减少了时间。 减少代码中的分支数量; 改善处理器中指令流水线的性能。 并且还减少了硬盘驱动器的流量。 硬盘驱动器需要处理的命令较少,因此开销也较小。

保持硬盘驱动器旋转要访问文件,硬盘驱动器必须将电动机提升到适当的速度(这需要时间),将磁头定位到所需的轨道和扇区,然后读取数据。 定位磁头并倾斜电动机是所有事务所需的管理时间。 读取数据的开销很小。 目的是在一个事务中读取尽可能多的数据,因为这是硬盘驱动器最有效的地方。 减少交易数量将减少等待时间,以增加电动机和定位磁头。

尽管现代计算机同时具有数据和命令的缓存,但减少数量将加快处理速度。 较大的“有效负载”将允许更有效地使用其缓存,而不需要对请求进行排序的开销。

解析内存更快
通常,从内存中读取要比从外部源中读取更快。 从缓冲区读取第二行文本需要增加一个指针。 从文件读取第二行需要I / O事务才能将数据存入内存。 如果您的程序有可用内存,请将数据拖到内存中,然后搜索内存。

太多数据否定了性能节省
计算机上有有限数量的RAM供应用程序共享。 访问比此内存更多的内存可能会导致计算机“分页”或将请求转发到硬盘驱动器(称为虚拟内存 )。 在这种情况下,可能几乎没有任何节省,因为无论如何(在程序不了解的情况下,操作系统都可以访问)硬盘驱动器。 通过分析可以很好地指示数据缓冲区的最佳大小。

我优化的应用程序一次从2 GB的文件中读取一个字节。 当我将程序更改为读取1 MB的数据块时,性能大大提高。 这还允许通过循环展开来提高性能。

希望这可以帮助。

操作系统(甚至您使用的C ++类)可能会分块读取文件并将其缓存,即使您逐行读取文件以提高将磁盘访问最小化的性能(从操作系统的角度来看,这样做也会更快)从内存缓冲区读取数据而不是从硬盘设备读取数据)。

请注意,提高程序性能(如果它确实是时间紧迫的)的一种好方法是减少对操作系统功能(管理其资源)的调用次数。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM