代码之家  ›  专栏  ›  技术社区  ›  Yigang Wu

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

  •  5
  • Yigang Wu  · 技术社区  · 16 年前

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

    1. 延迟加载动态链接库 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

    还有其他方法来改进它吗?事先谢谢。

    7 回复  |  直到 12 年前
        1
  •  5
  •   zr.    16 年前

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

        2
  •  5
  •   Alex Budovski    16 年前

    天哪!减少DLL计数!

    当然,如果你要在启动时加载200个DLL,会导致大量的硬页错误,并且需要永远启动(比如3dsmax)。

    重新考虑你的动态链接库策略。将许多小的DLL合并为较大的DLL。我很怀疑你是否需要200+。

    看陈瑞蒙的 Five Things Every Win32 Programmer Needs to Know .

        3
  •  2
  •   Michiel    16 年前

    我想你需要知道一些事情:

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

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

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

    或者,您甚至可以延迟加载DLL,方法是先用必要的DLL启动程序,然后按照使用的重要顺序加载其他DLL。

        4
  •  1
  •   DarthCoder    16 年前

    如果您可以访问DLL的代码(或者其中的一些代码),那么您可以查找静态链接的糖果。如果你能把它们转换成静态库,你就可以大大加快启动速度。

        5
  •  1
  •   Manuel    16 年前

    使用静态对象的惰性构造。

    而不是在启动期间创建全局数据,如:

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

        6
  •  1
  •   Mike Dunlavey    16 年前

    你得到了很好的建议。拥有许多DLL是你现在正在为之付出代价的时尚之一。此外,初始化它们可能比您需要做的要多得多。

    有一个简单的方法可以告诉你花了多少时间。在一个IDE下启动应用程序,比如Visual Studio,当它启动时,点击“暂停”按钮并显示调用堆栈。这样做几次。每次,你都会看到它在做什么,最重要的是, 为什么 .如果你看到它花了很多时间去做一些你不真正需要的事情,那么这就告诉你该怎么做。

        7
  •  0
  •   MadMurf    16 年前

    一个选项,以及它的纯心智游戏,是提供一个加载的进度条…

    如果人们有东西看,它会分散他们的注意力,让他们“感觉”更快,这就是为什么电梯之间有镜子,服务于许多楼层…

    不过,这可比不上秒表…

    另一种选择是重新编写以使用较少的DLL。下一个问题是你有多少预算(钱/时间)