我正在英特尔Core-2Duo平台上对Microsoft VS 2005中的C代码进行概要分析。 我通过我的函数测量时间(秒:毫秒)。但是我对这种测量的准确性有一些怀疑,因为操作系统不会连续运行我的应用程序,而是在我的代码执行之间安排其他应用程序/服务。(虽然我在执行配置文件时没有运行主要应用程序运行,仍然Windows将拥有自己的许多代码,它将通过抢占我的应用程序运行。)。因为所有这些我相信分析数字(我的应用程序运行所花费的时间)不准确。
所以我的问题是有没有办法找出操作系统开销,在典型的Windows系统上调度开销(我运行Windows XP),例如。如果我的应用程序说它运行了60毫秒,那么60毫秒,我的应用程序真正使用了多少时间。由于被操作系统安排的其他任务预先占用,它还有多少时间闲置?
或
根据你在做类似事情时遇到的经验,Atleast是否有任何球场号码来获得这样的操作系统开销?
答案 0 :(得分:1)
@Kogus:即使我在调试器外运行(来自命令提示符的独立应用程序),它仍然可以被操作系统抢占,并导致我的应用程序消耗的时间测量值不正确。
不是吗?
-AD
答案 1 :(得分:1)
我认为您将在粒度方面遇到一些问题。请参阅类似问题GetLocalTime() API time resolution和gettimeofday() guaranteed to be of microsecond resolution?
另外,您可能需要查看Windows Resource Kits Tools,其中包括timeit.exe(类似于unix / linux上的time
),以便为您提供已用时和处理时间。
答案 2 :(得分:0)
<强>建议强>
尝试在多CPU系统上运行。
答案 3 :(得分:0)
1 - 在代码中添加一些调试日志(当然包括时间戳),并在调试器外部运行
2 - 再次运行 in 调试器
3 - 重复多次,以获得统计上有效的数据。
4 - 比较。
如果独立版与调试版的平均执行时间存在显着差异,那么您对操作系统(或调试器挂钩本身的开销......)的怀疑是正确的。如果没有区别,那就不要出汗了。
Edit0:显然调试消息有一些自己的开销。即使从调试器运行,您也可能希望将它们保留在代码中。这样,独立代码和调试器都运行相同的代码。
编辑1:我误解了这个问题。我认为你担心的是 - 在调试时 - 操作系统可能比正常执行模式更频繁地中断你的应用程序。如果您想知道您的应用实际花了多少时间工作,只需比较任务管理器中“CPU时间”所花费的时间。
Edit2:将GetProcessTimes为您的流程返回的时间与实际执行时间进行比较。不同之处在于CPU花费在其他人身上的时间。
答案 4 :(得分:0)
这样做的最佳方式是使用专用的分析工具。那里有很多。几年来我没有用过C语言,其他人希望能够给出更好的建议。当您使用Visual Studio 2005时,这可能是一个很好的起点: AQ,但我从未使用过它。