2010-06-01 64 views
0

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

+0

为什么你需要最快的方法读取文件?这个文件有多快会改变?最快的通常是使用操作系统特定的通话,但你怎么知道你确实需要这些? – sbi 2010-06-01 09:50:07

+7

以最明智的方式阅读它们,只有在速度太慢时才担心性能。 – dreamlax 2010-06-01 09:50:25

+0

我可能必须读取10 MB的文件。 – Avinash 2010-06-01 09:57:19

回答

2

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

这个理由的基础是:

  • I/O事务
  • 保持硬盘纺纱
  • 分析内存的减少速度快

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

减少I/O事务
减少操作系统几个电话的I/O事务的结果,减少了时间的存在。减少代码中的分支数量;改善处理器中指令流水线的性能。并且还减少了硬盘驱动器的流量。硬盘驱动器处理的命令较少,所以它的开销较小。

保持硬盘驱动器纺纱 要访问一个文件时,硬盘驱动器的斜坡上升的马达以一个适宜的速度(这需要时间),头到所需的磁道和扇区的位置,并读出的数据。定位磁头并提升电机是所有交易所需的开销时间。阅读数据的开销很小。其目标是在一次交易中尽可能多地读取数据,因为这是硬盘驱动器效率最高的地方。减少交易次数将减少增加电机和定位磁头的等待时间。

尽管现代计算机有数据和命令的缓存,但减少数量会加快速度。较大的“有效载荷”将允许更高效地使用它们的缓存,而不需要对整理请求进行开销。

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

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

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

希望这会有所帮助。

6

你的问题更多的是关于硬件,操作系统和运行时库的性能,而不是编程语言。当你开始读取文件时,操作系统可能会以块的形式加载文件,因为文件以这种方式存储在磁盘上,操作系统在第一次访问时完全加载每个块并对其进行缓存而不是读取块,提取请求的数据并丢弃其余部分。

哪个更快?一次一行一行或一块一块地?像往常一样,这个答案不是你能预测的,唯一可以肯定的方法是编写一行一行的版本和一块一块的版本,并对它们进行描述(测量它的多长时间采取每个版本)。

+0

还要考虑到现代驱动器有自己的缓存,并且行为可能随TCQ和NCQ而改变。 – pmr 2010-06-01 12:47:16

2

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

1

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

请注意,提高程序性能的一个好方法(如果它确实非常重要)是尽量减少对操作系统功能(管理其资源)的调用次数。