哎呀!减少那些 DLL 数量吧!
当然,如果你在启动时加载了 200 个 DLL,它会产生大量的硬页错误,并且需要很长时间才能启动(就像 3ds max 一样)。
重新考虑你的 DLL 策略。将许多小的 DLL 合并成较大的 DLL。我认为你不需要超过 200 个。
并且观看 Raymond Chen 的 Five Things Every Win32 Programmer Needs to Know。
为了确定减速的真正原因,您需要对应用程序进行分析。例如,您可能会发现自己在加载某个.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的代码(或其中一些),则可以寻找候选项以进行静态链接。如果您可以将它们中的一堆转换为静态库,则可以大大加快启动速度。
你在这里得到了很好的建议。拥有许多DLL是一种过时的潮流,现在你正在为此付出代价。此外,初始化它们可能会做更多不必要的工作。
有一种简单的方法可以告诉你哪些操作需要时间。在IDE(例如Visual Studio)下启动应用程序,在它启动时按下“暂停”按钮并显示调用堆栈。多次执行此操作。每次,你都会看到它正在做什么,最重要的是,为什么。如果你发现它花费了大量时间在某些你不需要的操作上,那么这就告诉你需要修复什么。
一个选择,纯粹是心理战,就是在加载时提供进度条...
如果人们有东西可以看,会分散他们的注意力,并让它“感觉”更快,这就是为什么电梯之间有镜子,服务于多个楼层...
但这不会打败秒表...
另一种选择是重新编写代码,使用更少的DLL。你拥有多少预算(金钱/时间)是下一个问题。