【问题标题】:Measuring application startup performance测量应用程序启动性能
【发布时间】:2009-09-28 14:06:04
【问题描述】:

我在 Windows 上使用 C++/CLI。这是一个使用 /clr 构建的 MFC 应用程序。

我想测试我的应用程序启动需要多长时间。第一次用了10s,后来用了4s、4s、5s。我假设这是由于 Windows 缓存了 DLL。

是否有一些工具可以让我从缓存中删除一个目录,以便我的测试条件每次都相同?我不想在测试之间重新启动:)

【问题讨论】:

  • 您使用什么编程语言/平台? .net 中的启动时间首先最高,因为它仅在第一次运行时从 CIL 编译,然后后续运行速度更快。
  • 啊,你是对的,我忘记了那部分:) 我会编辑问题
  • ...但我仍然希望能够在不重新启动的情况下重新创建 10 秒的结果(也许清除 GAC 缓存或其他什么?)

标签: .net caching c++-cli startup measurement


【解决方案1】:

如果您使用的是 .Net 框架,那么这 6 秒很可能是在等待框架初始化(加载 mscoree.dll 等)。 CLR Inside Out: Improving Application Startup Performance 是为 MSDN 杂志撰写的文章。

冷启动需要加载所有 .Net Framework 并运行 JIT 编译器来生成代码。

在大多数情况下,冷启动受 I/O 限制。换句话说,花在等待数据上的时间比花在处理指令上的时间要多。启动应用程序所花费的时间等于操作系统从磁盘获取代码所花费的时间加上执行附加处理所花费的时间,例如 JITing IL 代码和在启动路径中执行的任何其他初始化应用。由于处理通常不是冷启动的瓶颈,因此任何应用程序启动性能调查的初始目标都是通过减少加载的代码量来减少磁盘访问。

当您第二次启动该应用程序时,几乎所有这些都已完成。即 DLL 已加载,它可能会提取先前编译的代码等。

减少启动时间的最佳方法是在第一个窗口显示之前减少 .Net 框架调用的数量(因为所有这些都需要在运行之前进行编译)并减少磁盘数量启动程序所需的 I/O。

一旦您的程序启动并运行,任何来自 .Net 的未编译 IL 都将在首次调用时由 JIT 编译器编译。

另外,据我所知,一旦加载了框架,没有一种简单的方法可以在不重新启动的情况下卸载它(如果你可以卸载它的话)。在加载框架之前让虚拟机处于保存状态可以大大减少“重新启动”所需的时间。

【讨论】:

  • 谢谢,我最终制作了一个虚拟机以避免重新启动,但直到现在才将其标记为已接受的答案:)
【解决方案2】:

Joshua说的,另外,看this answer的第三段。

【讨论】:

  • @demon:对不起,我的代码可能很快,但我很慢。我不明白。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2012-12-02
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多