C++ 用C+读取文件+;

C++ 用C+读取文件+;,c++,C++,我正在编写应用程序来监视一个文件,然后匹配该文件中的某些模式。 我想知道什么是最快的方式读取文件在C++中 逐行读取比读取文件块更快。你的问题更多的是硬件、操作系统和运行时库的性能,而不是编程语言。当您开始读取文件时,操作系统可能会以块的方式加载文件,因为文件以这种方式存储在磁盘上,因此操作系统完全在第一次访问时加载每个块并对其进行缓存是有意义的,而不是读取块,提取请求的数据并丢弃其余的数据 哪个更快?一次一行还是一块?与往常一样,答案不是你能预测的,唯一确定的方法是逐行编写版本和一次一块编写版

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

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


哪个更快?一次一行还是一块?与往常一样,答案不是你能预测的,唯一确定的方法是逐行编写版本和一次一块编写版本,并对它们进行分析(测量每个版本需要多长时间)。

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

< P> OS(甚至你使用的C++类)可能会读取文件并缓存它,即使你逐行读取,以提高最小化磁盘访问的性能。(从操作系统的角度来看,从内存缓冲区读取数据比从硬盘设备读取数据更快)


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

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

这个理由的基础是:

  • 减少I/O事务
  • 保持硬盘旋转
  • 解析内存更快
通过应用这些技术,我将一个应用程序的性能从65分钟提高到了2分钟

减少I/O事务
减少I/O事务会减少对操作系统的调用,从而缩短操作系统的时间。减少代码中的分支数量;提高处理器中指令管道的性能。还可以减少到硬盘驱动器的通信量。硬盘驱动器要处理的命令更少,因此开销更少

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

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

解析内存更快
从内存读取总是比从外部源读取快。从缓冲区读取第二行文本需要增加指针。从文件读取第二行需要I/O事务将数据放入内存。如果程序有空闲内存,请将数据拖入内存,然后搜索内存

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

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


希望这有帮助。

为什么需要最快的方法读取文件?此文件的更改速度有多快?最快的方法通常是使用特定于操作系统的调用,但您如何知道自己真的需要它?以最敏感的方式读取它们,并且只在速度太慢时才担心性能。我可能必须读取10 mb的文件。10 mb不会成为问题lem适用于任何现代计算机。即使是100mb也不行。别再想它了。还要考虑到现代驱动器有自己的缓存,并且行为可能会随着TCQ和NCQ而改变。