冷启动优化

时间:2010-09-27 20:55:09

标签: c++ visual-studio-2010 optimization mfc

我试图搜索,但到目前为止没有运气。有谁知道一个好的资源如何进行冷启动优化?

有问题的应用程序是C ++ / MFC应用程序,使用VS2010编译,完整版,内置分析器可用。我试图减少所有额外的重量,以使热启动的负载时间可以接受,但冷启动是完全不可接受的。有时接近30秒,并没有什么是慢代码明智的。热启动时Cpu负载达到80%,冷启动时低于20%。

我今天尝试使用延迟加载链接器设置,但我不太明白它们如何影响性能。此外,我尝试了可执行的打包程序,但VM上的测试似乎没有那么快。还有什么我可以尝试的吗?

4 个答案:

答案 0 :(得分:2)

长冷启动时间是纯硬盘问题。查找程序所需的DLL。除了运行碎片整理工具之外,您无法优化硬盘。对程序进行细分以使DLL加载与UI时间重叠非常困难。使用COM服务器或链接器的/ DELAYLOAD选项是显而易见的方法,但是在屏幕上获得功能性UI而不触及任何内容并不容易。将类分离为由工具栏或菜单选项触发的DLL当然是可能的,但MFC并不能使空闲时间UI更新变得那么容易(抱歉,忘记了确切的短语)。

你并不孤单,有这个问题的程序的好例子是Microsoft Office和Acrobat Reader。他们通过非常棘手的黑客来解决问题,他们在Run注册表项或Startup文件夹快捷方式中安装了“优化器”。除了触摸所有DLL以便将它们加载到文件系统缓存中之外,它什么都不做。在用户检查她的电子邮件后,给EXE一个热烈的开始。我讨厌他们并在他们再次放回去之后继续删除它们。但它确实改善了用户的意见,他们会认为电子邮件阅读器很慢。或者当然是爆炸的Windows-shoulda-gotten-a-Mac。

那就是说,30秒是一个很长的时间。确保这不仅仅是你的开发机器上的问题,通过一遍又一遍地构建二进制文件并将它们分散在整个磁盘上而引起。运行Defraggler。接下来,使用SysInternals的ProcMon实用程序检查它正在做什么。

答案 1 :(得分:1)

可能有用的一件事是查看配置文件引导优化,它会重新排序可执行文件,以便以最有效的顺序加载内容。

但实际上你应该尝试找出时间在哪里 - 听起来它可能正在进行大量的磁盘访问 - 你是否加载了大量的大数据(图像等?)。似乎不太可能是纯粹的代码加载需要花费很多时间。

您是否尝试过像Procmon(www.sysinternals.com)这样的工具来查看正在触摸的文件?

答案 2 :(得分:1)

  

“我今天尝试使用延迟加载链接器设置,但我不太明白它们如何影响性能。”

当您链接到DLL依赖项时,它会预先加载它 - 首次加载可执行文件时。延迟加载就像它建议的那样,延迟负载直到实际需要 - 当DLL中的类型或方法首次被可执行文件使用时,即你可以在模块级别将其视为lazy initialization

链接器正在有效地使用存根到LoadLibraryGetProcAddress。加载DLL后,将覆盖存根,以便从那时起直接调用DLL。

要利用这一点,您需要查看代码路径 - 在主屏幕上有条件地使用哪些变量或方法调用,在这种情况下,不需要预先加载它们。

答案 3 :(得分:0)

它正在做某事,你不知道它是什么。因此,尝试这一点,并调整它,在黑暗中刺伤。要求猜测,无论他们有多少受过教育,都不会好多了。

分析器总比没有好,但你需要找出真正的内容。

Here's a way to do that.

当然加载DLL可能是一个很大的启动问题,但也可能有其他事情发生。我发现的示例:检索国际化字符串(不需要)。建立数据结构,窗口和控件,然后在填充菜单和树视图时销毁它们并重新构建它们。如果抽象树很深,那真的很奇怪。