比较冷启动和热启动

Mot*_*tti 12 windows performance reboot

重新启动(冷启动)后,我们的应用程序比启动一次(热启动)需要更多的时间.

大多数(如果不是全部)差异似乎来自加载DLL,当DLL在缓存的内存页面中时,加载速度要快得多.我们尝试使用ClearMem来模拟重新启动(因为它比实际重新启动耗时少得多)并得到了混合结果,在某些机器上它似乎非常一致地模拟重启,而在某些机器上则没有.

总结我的问题是:

  1. 您是否在冷启动和暖启动之间的启动时间方面存在差异?
  2. 你是如何解决这些差异的?
  3. 你知道一种可靠地模拟重启的方法吗?

编辑:

澄清意见:

  • 该应用程序主要是带有一些.NET的本机C++(第一个加载的.NET程序集支付CLR).
  • 我们正在寻求改善加载时间,显然我们分享了分析并改进了代码中的热点.

我忘了提到的一点是我们通过重新设置所有二进制文件来获得一些改进,因此加载器不必在加载时执行它.

Jim*_*ger 6

至于模拟重启,您是否考虑过从虚拟PC运行您的应用程序?使用虚拟化,您可以方便地一遍又一遍地复制一组条件.

我还会考虑使用某种类型的性能分析应用程序来查找导致时滞的代码,然后判断该代码有多少是真正必要的,或者是否可以以不同的方式实现.


Mar*_*ark 3

您如何分析您的代码?并非所有分析方法都是相同的,有些方法比其他方法更能找到热点。您正在加载大量文件吗?如果是这样,磁盘碎片和寻道时间可能会发挥作用。

也许甚至将基本的计时信息粘贴到代码中、写入日志文件并在冷/热启动时检查文件将有助于确定位置花费了时间。

如果没有更多信息,我会倾向于文件系统/磁盘缓存作为两种环境之间可能的差异。如果是这种情况,那么您要么需要花更少的时间预先加载文件,要么找到更快的方法来加载文件。

示例:如果您要加载大量二进制数据文件,请通过将它们组合成一个文件来加快加载速度,然后一次读取将整个文件放入内存并解析其内容。更少的磁盘寻道和从磁盘读取数据所花费的时间。再说一次,也许这并不适用。

我不知道有什么工具可以清除磁盘/文件系统缓存,但是您可以编写一个快速应用程序来从磁盘读取一堆不相关的文件,从而导致文件系统/磁盘缓存加载不同的信息。

  • 从症状来看,耗时的似乎是加载代码而不是初始化代码的执行时间。在这种情况下,分析器将无济于事(除非可能是为了查看您是否在缩短加载时间方面取得了进展)。减少必须加载的 DLL 数量,使它们更小,重新调整它们的基数,以便不存在重叠。重新启动时,注册表访问也可能会很痛苦。 (2认同)