【发布时间】:2010-10-03 02:10:12
【问题描述】:
我有一个基准测试应用程序来测试我编写的一些 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 活动。
谢谢 尼兰詹
【问题讨论】:
-
Cory 对一个可能的问题做出了正确的回答。但是,如果您可以详细说明结果,那将有所帮助。例如,如果第二次运行更糟糕,那就是另一回事了。 :)
-
抱歉之前没有进行描述。行为是这样的:运行应用程序,关闭它并再次运行它,基准测试结果似乎在第二次运行时有所改善,此后保持不变。这种行为在从 C 盘运行的情况下更加突出。
标签: performance api benchmarking performancecounter