performance - 第二次运行托管应用程序显示与第一次不同的性能

标签 performance api benchmarking performancecounter

我有一个基准测试应用程序来测试我编写的一些 API 的性能。在这个基准测试应用程序中,我基本上使用 QueryPerformanceCounter 并通过将调用 API 前后 QPC 值的差异除以频率来获取时间。但是如果我从不同的驱动器运行应用程序(在同一组 Dll 上运行的相同可执行文件),基准测试结果似乎有所不同。此外,在特定驱动器上,第一次运行应用程序、关闭应用程序并再次重新运行它会产生不同的基准测试结果。谁能解释这种行为?我在这里错过了什么吗?

一些更有用的信息:

行为是这样的:运行应用程序,关闭它并再次运行它,基准测试结果似乎在第二次运行时有所改善,此后保持不变。这种行为在从 C 盘运行的情况下更为突出。
我还要提一下,我的基准测试应用程序可以选择重新运行/重新测试特定的 API,而无需关闭该应用程序。我确实理解涉及抖动,但我不明白的是,在应用程序的第一次运行时,当您在不关闭应用程序的情况下多次重新运行 API 时,性能会在运行几次后稳定下来,然后当您关闭并重新运行时同样的测试,性能似乎有所提升。

另外,当从不同驱动器运行时,您如何解释性能变化?

[信息更新]

我做了一个 ngen 现在来自同一位置的不同运行之间的性能差异消失了。即如果我打开基准测试应用程序,运行一次,关闭它并从同一位置重新运行它,它会显示相同的值。

但是我现在遇到了另一个问题。当我从 D 驱动器启动应用程序并运行它几次(在基准程序的同一启动中进行几次 API 迭代),然后从第 3 次迭代开始,所有 API 的性能似乎下降了 20% 左右.然后,如果您关闭并重新启动应用程序并运行它,对于前 2 次迭代,它会给出正确的值(与从 C 获得的值相同),然后性能再次下降。从 C 驱动器运行时不会出现此行为。从 C 盘来看,无论你跑多少次,它都非常一致。

我正在使用大型双数组来测试我的 API 性能。我担心 GC 会在测试之间启动,所以我在每次测试之前和之后明确调用 GC.Collect() 和 GC.WaitForPendingFinalizers()。所以我认为这与 GC 没有任何关系。

我尝试使用 AQ 时间来了解从第 3 次迭代开始发生的情况,但有趣的是,当我运行带有 AQ 时间分析的应用程序时,性能根本没有下降。

性能计数器 as 不建议任何有趣的 IO 事件。

谢谢
尼兰詹

最佳答案

运行应用程序会将其可执行文件和其他文件从硬盘驱动器放入操作系统的磁盘缓存(在 RAM 中)。如果此后不久再次运行,其中许多文件可能仍在缓存中。 RAM 比磁盘快得多。

当然,一个磁盘可能比另一个更快。

关于performance - 第二次运行托管应用程序显示与第一次不同的性能,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/472040/

相关文章:

java - 如何根据Java类的API文档使用它

c++ - 如何对 C++ 代码的性能进行基准测试?

go - 使用 Goroutines 进行基准测试

c++ - 一个很好的 OO 方法来做到这一点 (c++)

PHP 高性能搜索文本中的给定用户名

javascript - Kendo UI Treeview 追加函数性能

c - API 应该假设正确的调用顺序,还是应该验证这些假设?

haskell - 惯用的高效 Haskell append ?

api - 有没有办法让 API 在 Azure 上暂时不可用?

c# - C# 中的时间基准装饰器