强制执行到内存?

时间:2014-03-05 14:05:43

标签: c++

我有一个cpp可执行文件(它包含静态库),大小约为1MB。当我运行exe时,它消耗的内存不到200kb。

根据我的理解,这意味着计算机在需要硬盘时一点一点地读取exe文件。

我想提高性能,甚至一点点,所以,我怎么说“将exe加载到内存中”并且不要触摸硬盘?这会带来任何性能提升吗?

3 个答案:

答案 0 :(得分:2)

操作系统会根据需要将部分可执行文件加载到内存中。这是了解有关指令缓存的更多信息的地方。我们的想法是构建程序,以便将公共代码组合在一起。例如,您可能有一些内联函数 - 在这种情况下,操作系统必须在多个地方加载相同的代码,这可能很慢。通过删除内联,你可以在内存中的一个块中获得缓存的代码,从而减少加载时间。

我同意其他人的观点,但是这种类型的优化应该在您分析之后才能保留,并确定这是瓶颈,这是非常不可能的

答案 1 :(得分:1)

在全球范围内,强制所有程序进入RAM会降低速度。 通常有大部分代码未执行 在任何特定的运行中,都没有必要从中读取这些内容 磁盘。

将程序的全部或部分强制转换为RAM可能会产生影响 是延迟。如果您实时回复外部 事件,必须加载代码以便响应将减少 潜伏。这只能通过使用特定系统来完成 请求(例如支持读取的Posix系统下的mlock 时间延长)。您可能必须拥有特殊权利 但是能够做到这一点。实际上,它只应该使用 在专用于特定应用程序的机器上,因为它可以 对系统总体性能产生非常不利的影响。 (有一个原因是它是实时扩展,而不是 在基本Posix中。)锁定函数在内存中使用的地址意味着执行时不会出现页面错误。

答案 2 :(得分:1)

如果你真的想要这样做,你需要通过阅读来触摸内存页面。但强制页面进入内存一次并不能保证它们会留在内存中。一个明显的替代解决方案是VirtualLock该地区,但实际上这个功能并不像你想象的那样(至少在我使用它的任何系统上),即使你有适当的privilegues。

请注意,默认的最小工作集只有16MB,因此对于较大的可执行文件,强制页面进入RAM将必然将其他人(您需要的!)推出工作集,因此这是事实上反优化。除非你有必要的特权来增加工作集的大小。

找出可执行文件的映射开始和结束的位置有点乏味。并不是说它不可能,但它比再次映射文件要复杂得多。然后你只需运行一个循环,每4096字节读取一个字节,你就完成了。这将消耗两倍的地址空间,但会消耗相同数量的RAM(归功于内存映射的工作方式)。

但是,实际上,你会从中获得绝对没有

操作系统不需要加载整个可执行文件,也不需要一直保持驻留状态。您的可执行文件的一部分将是调试信息或导入信息,加载程序可能会查看一次(或不会查看),之后永远不需要。强制将该内容强制到内存中意味着您从工作集中清除有用的页面 操作系统可能具有缓冲区缓存中不可见的部分(或大部分),但即使不是这样,您也几乎不会注意到差异。