我有一个基准测试应用程序来测试我编写的一些 API 的性能。在这个基准测试应用程序中,我基本上使用 QueryPerformanceCounter 并通过将调用 API 前后 QPC 值的差异除以频率来获取时间。但是如果我从不同的驱动器运行应用程序(在同一组 Dll 上运行的相同可执行文件),基准测试结果似乎会有所不同。此外,在特定驱动器上,第一次运行应用程序、关闭应用程序并再次运行它会产生不同的基准测试结果。谁能解释这种行为?我在这里错过了什么吗?
一些更有用的信息:
行为是这样的:运行应用程序,关闭它并再次运行它,基准测试结果似乎在第二次运行时有所改善,此后保持不变。这种行为在从 C 盘运行的情况下更加突出。我还想提一下,我的基准应用程序可以选择重新运行/重新测试特定的 API,而无需关闭应用程序。我确实知道这涉及到 jitting,但我不明白的是,在第一次运行应用程序时,当您在不关闭应用程序的情况下多次重新运行 API 时,性能在运行几次后稳定下来,然后当您关闭并重新运行时同样的测试,性能似乎有所提高。
此外,您如何考虑从不同驱动器运行时的性能变化?
[信息更新]
我做了一个ngen,现在来自同一位置的不同运行之间的性能差异消失了。即如果我打开基准应用程序,运行一次,关闭它并从同一位置重新运行它,它会显示相同的值。
但是我现在遇到了另一个问题。当我从 D 驱动器启动应用程序并运行它几次(在同一启动基准程序中的 API 迭代几次),然后从第 3 次迭代开始,所有 API 的性能似乎下降了 20% 左右. 然后,如果您关闭并重新启动应用程序并运行它,对于前 2 次迭代,它会给出正确的值(与从 C 获得的值相同),然后性能再次超出该值。从 C 盘运行时看不到此行为。从 C 盘开始,无论您运行多少次,它都非常一致。
我正在使用大型双数组来测试我的 API 性能。我担心 GC 会在测试之间启动,所以我在每次测试之前和之后都明确地调用 GC.Collect() 和 GC.WaitForPendingFinalizers()。所以我认为这与GC无关。
我尝试使用 AQ 时间来了解从第 3 次迭代开始发生了什么,但有趣的是,当我使用 AQ 时间分析它运行应用程序时,性能根本没有下降。
性能计数器 as 不建议任何有趣的 IO 活动。
谢谢尼兰詹