提高C ++应用程序启动速度的方法

时间:2010-02-02 11:12:37

标签: c++ windows performance

最近,我的老板要求我提高应用程序的启动速度,AP是用C ++编写的。 AP有点大,它使用200+ dll,Windows需要很长时间才能进入main()函数。我尝试了这两种方式,但仍然无法让老板高兴。

  1. 延迟加载dll http://msdn.microsoft.com/en-us/library/yx9zd12s(VS.80).aspx
  2. 使用EDITBIN修改EXE http://msdn.microsoft.com/en-us/library/xd3shwhf(VS.80).aspx
  3. 还有其他改进方法吗?提前谢谢。

7 个答案:

答案 0 :(得分:5)

哎呀!减少DLL计数!

当然,如果你要在启动时加载200个DLL,它会产生大量的硬页错误,并且需要永久启动(比如3ds max)。

重新思考您的DLL策略。将许多小DLL组合成较大的DLL。我严重怀疑你需要200 +。

观看Raymond Chen的Five Things Every Win32 Programmer Needs to Know

答案 1 :(得分:5)

您需要对应用程序进行概要分析,以确定减速的真正原因。例如,可能是您在大部分时间都在一个正在加载的.dll的初始化例程中。去找一个好的分析工具,然后确定瓶颈在哪里。

答案 2 :(得分:2)

我想你需要知道几件事:

  • 许多小文件比一些大文件慢
  • 磁盘访问比内存访问慢得多(需要从磁盘加载DLL)

在这种情况下,减少DLL的数量是必须的。也许你可以合并,但我想这是一个模块化的设计,这意味着,大多数时候,它们不能合并。

您还可以在使用时加载DLL,而不是在打开程序时加载,并且只加载必要的DLL以在启动时加载程序。

或者您甚至可以通过首先使用必要的DLL启动程序然后加载其他DLL来延迟加载DLL。

答案 3 :(得分:1)

如果你有权访问dll(或其中一些)的代码,你可以寻找候选人来静态链接。如果你可以将它们中的一大堆转换为静态库,那么你可以大大提高启动速度。

答案 4 :(得分:1)

使用惰性构造静态对象。

而不是在启动期间创建全局变量,如下所示:

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没有帮助。

答案 5 :(得分:1)

你在这里得到了很好的建议。拥有许多DLL是您现在支付的那些传递时尚的人之一。此外,初始化它们可能比你需要的要多得多。

有一种简单的方法可以说明花时间。在IDE(如Visual Studio)下启动应用程序,在启动时,点击“暂停”按钮并显示调用堆栈。这样做几次。每次,您都会看到它正在做什么,最重要的是,为什么。如果你发现你花了很多时间做一些你并不真正需要的东西,那就告诉你要修复什么。

答案 6 :(得分:0)

一个选项及其纯粹的思维游戏,就是在加载时提供进度条......

如果人们有什么东西可以看,它会分散他们的注意力并使其“感觉”更快,这就是为什么电梯之间有镜子可用于多层楼......

虽然这不会超过秒表......

另一种方法是重新编写它以使用更少的DLL。你有多少预算(金钱/时间)是下一个问题