最近,老板要求我提高应用程序的启动速度,AP是用C ++编写的。 AP有点大,它使用了200多个DLL,Windows需要很长时间才能进入main()函数。 我尝试了这两种方式,但还是无法让老板高兴。
还有其他的方法来改善它吗? 提前致谢。
您需要分析您的应用程序,以确定放缓的真正原因。 例如,可能是因为大部分时间都花在某个正在加载的.dll文件的初始化例程上。 去找一个好的分析工具,然后确定瓶颈在哪里。
哎呀! 减少这个DLL数量!
当然,如果你要在启动时加载200个DLL,它将会产生大量的硬性页面错误,并且需要永远启动(比如3ds max)。
重新考虑你的DLL策略。 将很多小的DLL合并成更大的DLL。 我严重怀疑你需要200+。
观看Raymond Chen的每件Win32程序员都需要知道的五件事 。
我想你需要知道几件事情:
在这种情况下,减少DLL的数量是必须的。 也许你可以合并,但我想这是一个模块化的设计,这意味着,大多数时候,他们不能合并。
您也可以在使用时加载DLL,而不是打开程序,只加载必要的DLL以在启动时加载程序。
或者你甚至可以通过首先启动带有必要的DLL的程序来加载DLL,然后加载其他的DLL,以便使用。
如果您有权访问dll(或其中一些)的代码,则可以查找静态链接。 如果你可以把它们转换成静态库,你可以加快启动的速度。
使用惰性构造的静态对象。
而不是在启动期间创建全局变量,如下所示:
Foo foo; Bar bar; int main() { // Access foo and bar }
让他们按照以下习惯用语进行构建:
Foo & foo() { static Foo the_instance; return the_instance; } Bar & bar() { static Bar the_instance; return the_instance; } int main() { // Access objects through foo() and bar() }
如果创建对象的开销很大(例如,必须建立大的查找表或执行繁重的IO),这将为您节省一些启动时间。
这将无法帮助加载这些DLL的。
你在这里得到很好的建议。 有许多DLL是你现在付出的时尚之一。 另外,初始化它们可能会比你需要的做得更多。
有一个简单的方法来告诉正在花费什么时间。 在IDE(如Visual Studio)下启动应用程序,并在启动时点击“暂停”按钮并显示调用堆栈。 多次这样做。 每一次,你会看到它在做什么,最重要的是, 为什么 。 如果你看到花很多时间去做一些你并不需要的东西,那么这就告诉你要修复的东西。
一个选项,纯粹的头脑游戏,是提供一个进度条加载…
如果人们有一些东西要看,那就分散他们的注意力,让他们“感觉”更快,这就是为什么在电梯之间有镜子,这些镜子是服务于许多楼层的。
这不会打秒表,但…
另一种方法是重写它以使用更少的DLL。 下一个问题是你有多少预算(金钱/时间)