比较冷启动和热启动

时间:2008-09-24 13:11:34

标签: windows performance reboot

我们的应用程序在重新启动(冷启动)后启动所需的时间比已经打开一次(热启动)的时间要多得多。

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

总结我的问题是:

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

    澄清评论:

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

    我忘记提到的一点是,我们通过重新设置所有二进制文件得到了一些改进,因此加载程序不必在加载时执行此操作。

10 个答案:

答案 0 :(得分:6)

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

我还会考虑使用某种类型的profiling app来查找造成时间延迟的代码位,然后判断调用该代码中有多少是真正必要的,或者是否可以在不同的方式。

答案 1 :(得分:4)

要真正模拟软件重启很难。重新启动时,机器中的所有设备都会将其复位位置为有效,这会导致系统范围内的所有内存丢失。

在一台现代化的机器中,你到处都有内存和缓存:有一个VM子系统,它为程序存储内存页面,然后你有操作系统缓存内存中文件的内容,那你就得到了硬盘本身扇区的磁盘缓冲区。您可以重置操作系统缓存,但驱动器上的磁盘缓冲区?我不知道有什么方法。

答案 2 :(得分:3)

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

甚至可能会将基本的计时信息粘贴到代码中并写入日志文件并检查冷/热启动时的文件将有助于识别应用程序花费时间的

如果没有更多信息,我会倾向于文件系统/磁盘缓存,因为这两种环境之间可能存在差异。如果是这种情况,那么您需要花费更少的时间预先加载文件,或者找到加载文件的更快方法。一个例子(可能不适用)是,如果你正在加载二进制数据文件的加载是将它们全部组合成一个文件,在一次读取中将整个文件的slerp写入内存,然后解析它们的内容。减少磁盘占用空间和读取磁盘所需的时间。同样,也许这不适用。我不知道任何清除磁盘/文件系统缓存的工具,但你可以写一个快速的应用程序从磁盘上读取一堆不相关的文件,导致文件系统/磁盘缓存加载不同的信息。

答案 3 :(得分:2)

@ Morten Christiansen说:

  

使应用程序以更快的速度启动冷启动的一种方法(类型)被例如使用。 Adobe Reader,通过在启动时加载一些文件,从而隐藏用户的冷启动。这仅在程序不应立即启动时才可用。

这使得客户在每次启动时都会为我们的应用付费,即使它没有被使用,我真的不喜欢这个选项(Raymond也没有。)

答案 4 :(得分:2)

加速应用程序启动的一个成功方法是将DLL切换为延迟加载。这是一个低成本的变化(一些摆弄项目设置),但可以使启动速度明显加快。然后,在profiling模式下运行depends.exe以确定在启动期间加载哪些DLL,并恢复它们的延迟加载。请记住,您也可能延迟加载大多数所需的Windows DLL。

答案 5 :(得分:2)

一种非常有效的改进应用冷启动时间的技术是优化功能链接排序。

Visual Studio链接器允许您传入一个文件列出所链接模块中的所有函数(或者只是其中的一部分 - 它不一定都是所有函数),链接器会将这些函数放在旁边彼此在记忆中。

当您的应用程序启动时,通常会在整个应用程序中调用init函数。其中许多调用将是一个尚未在内存中的页面,导致页面错误和磁盘搜索。这就是慢启动的起源。

优化您的应用程序,以便所有这些功能在一起可以是一个巨大的胜利。

在Visual Studio 2005或更高版本中查看配置文件引导优化。 PGO为您做的事情之一就是功能链接排序。

在构建过程中工作有点困难,因为使用PGO,您需要链接,运行应用程序,然后重新链接配置文件运行的输出。这意味着你的构建过程需要有一个运行时环境并在错误的构建之后进行清理以及所有这些,但是在没有代码更改的情况下,回报通常是冷启动速度超过10倍或更快。

这里有关于PGO的更多信息:

http://msdn.microsoft.com/en-us/library/e7k32f4k.aspx

答案 6 :(得分:1)

作为功能顺序列表的替代方法,只需将在同一部分中调用的代码分组:

#pragma code_seg(".startUp")
 //...
#pragma code_seg

#pragma data_seg(".startUp")
 //...
#pragma data_seg

在代码更改时应该很容易维护,但与功能顺序列表具有相同的好处。

我不确定功能顺序列表是否也可以指定全局变量,但使用此#pragma data_seg只会起作用。

答案 7 :(得分:0)

使应用程序以更快的速度启动冷启动的一种方法(类型)被例如使用。 Adobe Reader,通过在启动时加载一些文件,从而隐藏用户的冷启动。这仅在程序不应立即启动时才可用。

另一个注意事项是,.NET 3.5SP1据说可以大大提高冷启动速度,不过多少,我不能说。

答案 8 :(得分:0)

它可能是NIC(局域网卡),您的应用程序取决于其他某些 需要网络出现的服务。因此,单独分析您的应用程序可能并不能完全告诉您这一点,但您应该检查应用程序的依赖关系。

答案 9 :(得分:0)

如果您的应用程序不是很复杂,您只需将所有可执行文件复制到另一个目录,它应该类似于重新启动。 (剪切和粘贴似乎不起作用,Windows足够聪明,知道移动到另一个文件夹的文件缓存在内存中)