大型应用程序/文件加载时间

时间:2009-02-18 09:23:14

标签: windows performance load-time

我相信很多人都注意到当你有一个大型应用程序(即需要几MB的DLL)时,它第二次加载的速度比第一次快得多。 如果您在应用程序中读取大文件,也会发生同样的情况。第一次之后它的读取速度要快得多。

这有什么影响?我想这是硬盘驱动器缓存,或者操作系统增加了自己的内存缓存。

您使用哪些技术来加速大型应用程序和文件的加载时间?

提前致谢

注意:问题涉及Windows

补充:影响操作系统缓存大小的因素是什么?在某些应用程序中,文件在一分钟左右后再次缓慢加载,因此缓存会在一分钟内填满?

8 个答案:

答案 0 :(得分:9)

有两件事可以影响这一点。第一个是硬盘缓存(由磁盘完成,影响很小,操作系统往往会产生更大的影响)。第二个是Windows(和其他操作系统')没有理由在他们完成它们时卸载DLL,除非其他东西需要内存。这是因为DLL可以在进程之间轻松共享。

因此,即使在使用它们的应用程序消失之后,DLL也有一种闲散的习惯。如果另一个应用程序决定需要DLL,它已经在内存中,只需要映射到进程地址空间。

我已经看到一些应用程序预装了他们需要的DLL(通常称为QuickStart,我认为MS Office和Adobe Reader都这样做),以便感知加载时间更好。

答案 1 :(得分:6)

Windows的内存管理器实际上很漂亮 - 它为内存请求提供服务并充当磁盘缓存。如果系统上有足够的可用内存,最近访问过的大量文件将驻留在内存中。在需要物理内存之前,这些DLL将保留在缓存中 - 所有这些都是CacheManager。

至于如何提供帮助,请查看延迟加载DLL。 LoadLibrary的优点仅在您需要时,但是自动使您在所有代码上都没有LoadLibrary / GetProcAddress。 (自动,只需要添加链接器命令开关):

http://msdn.microsoft.com/en-us/library/yx9zd12s.aspx

或者你可以预装像Office和其他人一样(如上所述),但我个人讨厌 - 在初次启动时减慢计算机速度。

答案 2 :(得分:4)

我看到两种可能性:

  • 在系统启动时预加载您的库,因为已经提到的Office,OpenOffice和其他人正在这样做。

我不是那个解决方案的忠实粉丝:它会让你的启动时间更长,并且占用大量内存。

  • 仅在需要时动态加载DLL(请参阅LoadLibrary)。不幸的是,所有DLL都不可能。

例如,为什么在启动时加载DLL以导出XYZ格式的文件,而不确定是否需要它?当用户选择此导出格式时加载它。

我有一个Adobe Acrobat使用这种方法的梦想,而不是每次我想显示PDF文件时都不会使用大量的插件!

根据您的需要,您可能必须使用这两种技术:预加载一些大型重型库,​​并按需加载特定插件......

答案 3 :(得分:2)

可能值得关注的一个项目是“变基”。每个DLL都有一个预设的“基本”地址,它更喜欢将其加载到内存中。如果应用程序正在将DLL加载到不同的地址(因为首选的地址不可用),则DLL将在新地址加载并“重新绑定”。粗略地说,这意味着dll的部分内容会即时更新。这仅适用于本机映像,而不是.NET vm .dll。

这篇真正陈旧的MSDN文章涵盖了rebase'ng: http://msdn.microsoft.com/en-us/library/ms810432.aspx

不确定它是否仍然适用(这是一篇非常古老的文章)......但这里有一个诱人的引用:

  

首选一个大型DLL   小的;确保   操作系统不需要   很长时间搜索DLL;和   如果有机会,请避免许多修正   DLL可能会被重新绑定   操作系统(或者,   尝试选择你的基地址   不太可能改变基础。)

顺便说一下,如果你正在处理.NET,那么“ngen'ng”你的app / dll应该有助于加快速度(ngen = natve图像生成)。

答案 4 :(得分:1)

是的,从硬盘驱动器读入的任何内容都会被缓存,因此第二次加载速度会更快。基本假设是很少使用HD中的大块数据一次然后丢弃它(这在实践中通常是一个很好的假设)。通常我认为这是实现缓存的操作系统(内核),占用了大量的RAM来完成,尽管我不确定现代硬盘是否具有一些内置缓存功能。 (我曾经写过一个小内核作为学术项目;在内存中缓存高清数据是其功能之一)

答案 5 :(得分:1)

影响程序启动时间的另一个因素是Superfetch,这是一种与(我相信)Windows XP一起引入的技术。本质上,它在程序启动期间监视磁盘访问,识别文件访问模式,并尝试“聚集”所需数据以便更快地访问(例如,通过根据其加载顺序在磁盘上按顺序重新排列数据)。

正如其他人所提到的,一般来说,任何读取操作都可能由Windows磁盘缓存缓存,并重新使用,除非其他操作需要内存。

答案 6 :(得分:1)

NGENing程序集可能有助于启动时间,但是,运行时可能会受到影响(有时候NGened代码不像OnDemand Compiled代码那样最优)

NGENing也可以在后台完成:http://blogs.msdn.com/davidnotario/archive/2005/04/27/412838.aspx

这是另一篇好文章NGen和Performance http://msdn.microsoft.com/en-us/magazine/cc163808.aspx

答案 7 :(得分:0)

系统缓存用于从磁盘上下载的任何内容。这包括文件元数据,因此如果您使用打开大量文件的应用程序(例如,目录扫描程序),那么如果您运行的应用程序耗尽了大量内存,则可以轻松刷新缓存。

对于我使用的东西,我更喜欢使用少量大文件(> 64 MB到1 GB)和异步非缓冲I / O.而且每隔一段时间就会有一次很好的defrag。