用C ++读取文件

时间:2010-06-01 09:46:31

标签: c++

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

4 个答案:

答案 0 :(得分:6)

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

哪个更快?逐行或大块一次?与往常一样,答案不是你可以预测的,唯一可以确定的方法是编写逐行版本和一次一块的版本并对它们进行分析(测量它的长度)采用每个版本。)

答案 1 :(得分:2)

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

答案 2 :(得分:2)

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

这种理由的基础是:

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

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

减少I / O交易
减少I / O事务会导致很少调用操作系统,从而减少了操作系统的时间。减少代码中的分支数量;提高处理器中指令管道的性能。并且还减少了到硬盘的流量。硬盘驱动器的命令较少,因此开销较少。

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

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

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

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

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

希望这有帮助。

答案 3 :(得分:1)

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

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