Warning: file_get_contents(/data/phpspider/zhask/data//catemap/0/performance/5.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Windows 冷起动与热起动的比较_Windows_Performance_Reboot - Fatal编程技术网

Windows 冷起动与热起动的比较

Windows 冷起动与热起动的比较,windows,performance,reboot,Windows,Performance,Reboot,我们的应用程序在重新启动(冷启动)后启动所花费的时间比已经打开一次(热启动)要长得多 大多数(如果不是全部的话)差异似乎来自加载DLL,当DLL位于缓存内存页中时,它们加载得更快。我们尝试使用来模拟重新启动(因为它比实际重新启动花费的时间要少得多),结果好坏参半,在一些机器上,它似乎非常一致地模拟重新启动,而在一些机器上则不是 总括而言,我的问题是: 您是否经历过冷启动和热启动之间的启动时间差异 你是如何处理这些差异的 你知道可靠地模拟重启的方法吗 编辑: 澄清意见: 应用程序主要是用.NET

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

大多数(如果不是全部的话)差异似乎来自加载DLL,当DLL位于缓存内存页中时,它们加载得更快。我们尝试使用来模拟重新启动(因为它比实际重新启动花费的时间要少得多),结果好坏参半,在一些机器上,它似乎非常一致地模拟重新启动,而在一些机器上则不是

总括而言,我的问题是:

  • 您是否经历过冷启动和热启动之间的启动时间差异
  • 你是如何处理这些差异的
  • 你知道可靠地模拟重启的方法吗
  • 编辑:

    澄清意见:

    • 应用程序主要是用.NET的本地C++(第一个.NET程序集加载的CLR)。
    • 我们希望缩短加载时间,显然我们也做了分析工作,并改进了代码中的热点

    我忘了提到的一点是,我们通过重新构建所有二进制文件获得了一些改进,这样加载程序就不必在加载时执行此操作。

    至于模拟重新启动,您是否考虑过从服务器上运行应用程序?使用虚拟化,您可以方便地反复复制一组条件


    我也会考虑某种类型的代码来找出导致时间滞后的代码,然后做出判断,调用该代码有多少是真正必要的,或者是否可以以不同的方式实现。

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


    在现代机器中,到处都有内存和缓存:有VM子系统为程序存储内存页,然后是操作系统在内存中缓存文件内容,然后是硬盘上扇区的磁盘缓冲区。您可能可以重置操作系统缓存,但是驱动器上的磁盘缓冲区?我不知道有什么方法。

    有一种方法可以让应用程序更快地启动冷启动(某种程度上),比如Adobe reader,在启动时加载一些文件,从而对用户隐藏冷启动。这仅在程序不应立即启动时可用


    另一个值得注意的是,据说.NET 3.5SP1大大提高了冷启动速度,但我不能说提高了多少。

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

    甚至在代码中插入基本的计时信息,写入日志文件,并在冷启动/热启动时检查这些文件,都有助于识别应用程序在哪里花费时间

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

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

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

    可能是NIC(LAN卡),并且您的应用程序依赖于某些其他工具 需要网络启动的服务。因此,单独分析应用程序可能无法说明这一点,但您应该检查应用程序的依赖关系。

    @说:


    例如,Adobe reader使用了一种让应用程序更快地启动冷启动的方法,即在启动时加载一些文件,从而对用户隐藏冷启动。这仅在程序不应立即启动时可用


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

    加速应用程序启动的一个成功方法是将DLL切换到延迟加载。这是一个低成本的更改(有些更改会影响项目设置),但可以使启动速度大大加快。然后,在分析模式下运行depends.exe以确定在启动过程中加载了哪些DLL,并恢复它们上的延迟加载。请记住,您也可以延迟加载所需的大多数Windows DLL。

    提高应用程序冷启动时间的一项非常有效的技术是优化函数链接顺序

    VisualStudio链接器允许您传入一个文件,该文件列出了被链接模块中的所有函数(或者只是其中的一部分——不一定是所有函数),链接器会将这些函数彼此相邻地放置在内存中

    当应用程序启动时,通常会在整个应用程序中调用init函数。这些调用中的许多都是对内存中尚未存在的页面的调用,从而导致页面错误和磁盘搜索。这就是缓慢启动的原因

    优化应用程序,使所有这些功能结合在一起,这将是一个巨大的胜利

    请在VisualStudio2005或更高版本中查看配置文件引导优化。PGO为您做的一件事是函数链接排序

    在构建过程中工作有点困难,因为使用PGO,您需要链接、运行应用程序,然后重新链接概要文件运行的输出。这意味着您的构建过程需要有一个运行时环境,并在错误构建和所有这些之后进行处理清理,但回报通常是10+或更多
    #pragma code_seg(".startUp")
     //...
    #pragma code_seg
    
    #pragma data_seg(".startUp")
     //...
    #pragma data_seg