内存中,int和char哪个更快?文件映射和分块读取哪个更快?

6

好的,我之前写过一个(不太优化的)程序来将图像编码为JPEG格式,但是现在我正在处理MPEG-2传输流和其中的H.264编码视频。在我开始编程之前,我很好奇如何以最快的方式处理实际文件。

目前,我正在将.mts文件映射到内存中进行处理,但我不确定将100 MB的文件分块读入内存并进行处理是否更快。

这些文件需要大量的位移操作等来读取标志,因此我想知道当我引用一些内存时,每次读取4个字节作为整数还是1个字节作为字符更快。我记得在某个地方读到过x86处理器针对4字节粒度进行了优化,但我不确定这是否正确...

谢谢!

5个回答

6

如果您需要文件同步可用,那么内存映射文件通常是最快的操作。(有一些异步API可以允许操作系统重新排序以获得轻微的速度提升,但这似乎对您的应用程序没有帮助)

使用映射文件的主要优点是,您可以在操作系统从磁盘读取文件时在内存中处理该文件,并且您不必管理自己的锁定/线程文件读取代码。

就内存引用而言,在x86上,无论您实际使用什么,内存都将一次性读取整个行。与非字节粒度操作相关的额外时间是指整数不需要按字节对齐的事实。例如,如果未按4字节边界对齐,则执行ADD将需要更多时间,但对于像内存复制这样的操作,几乎没有区别。如果您正在处理固有字符数据,则保持原样比将所有内容都读取为整数并位移更快。

如果您正在进行h.264或MPEG2编码,则瓶颈可能是CPU时间,而不是磁盘I/O。


2
如果你需要访问整个文件,那么将其读入内存并在内存中进行处理总是更快的。当然,这也会浪费内存,并且你需要以某种方式锁定文件,以便其他应用程序不会同时访问它,但优化本来就是关于妥协的。如果你跳过了(大)文件的一部分,那么内存映射会更快,因为你根本不需要读取它们。
是的,以4字节(甚至8字节)为粒度访问内存比按字节访问更快。同样,这是一个妥协 - 根据之后对数据要进行什么操作以及你在操作int位时的技能水平,总体上可能并不更快。
至于优化方面的一切:
1. 测量 2. 优化 3. 测量

+1,难道不是“测量,测量,优化,再次测量”吗? - David Rodríguez - dribeas

1

这些是连续的比特流-您基本上一次一个比特地消耗它们,而没有随机访问。

在这种情况下,您不需要花费大量精力来明确缓冲读取和类似操作:操作系统将为您缓冲它们。我以前编写过H.264解析器,时间完全被解码和操作所占据,而不是IO。

我的建议是使用标准库来解析这些位流。

Flavor 就是这样一个解析器,该网站甚至包括了MPEG-2(PS)和各种H.264部分(如M-Coder)的示例。Flavor从类似于c++的语言构建本地解析代码;以下是MPEG-2 PS规范中的一句话:

class TargetBackgroundGridDescriptor extends BaseProgramDescriptor : unsigned int(8) tag = 7 
{
    unsigned int(14) horizontal_size;
    unsigned int(14) vertical_size;
    unsigned int(4) aspect_ratio_information;
}

class VideoWindowDescriptor extends BaseProgramDescriptor : unsigned int(8) tag = 8 
{
    unsigned int(14) horizontal_offset;
    unsigned int(14) vertical_offset;
    unsigned int(4) window_priority;
}

0
关于内存映射文件需要考虑的一件事是,大小超过可用地址范围的文件只能映射文件的一部分。要访问文件的其余部分需要取消映射第一部分并在其位置上映射下一部分。
由于您正在解码MPEG流,因此可能希望使用双缓冲区方法和异步文件读取。它的工作方式如下:
blocksize = 65536 bytes (or whatever)
currentblock = new byte [blocksize]
nextblock = new byte [blocksize]
read currentblock
while processing
   asynchronously read nextblock
   parse currentblock
   wait for asynchronous read to complete
   swap nextblock and currentblock
endwhile

0

关于从内存中读取的最佳大小,我相信您会喜欢阅读这篇文章,其中涉及内存访问性能和缓存效应。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接