进行分析时操作系统开销很大?
我正在对Intel Core-2Duo平台上的Microsoft VS 2005中的C代码进行性能分析。
我测量我的函数计算的时间(秒:毫秒)。但是我对此测量的准确性有一些怀疑,因为操作系统不会持续运行我的应用程序,而是在我的代码执行之间安排其他应用程序/服务。仍然运行Windows,但Windows仍将拥有大量自己的代码,这些代码将通过抢占我的应用程序来运行。)由于所有这些,我认为配置文件编号(我的应用程序运行所花费的时间)不准确。
所以我的问题是有没有办法找出操作系统开销,在典型的Windows系统(我运行Windows XP)上安排开销。如果我的应用程序说运行了60毫秒(即60毫秒),则我的应用程序实际使用了多少时间。以及由于操作系统安排的其他一些任务抢占了多少空闲时间?
或者
根据我们在执行类似操作时遇到的经验,Atleast是否有足够的预算来获得这样的OS开销?
解决方案
回答
建议
尝试在多CPU系统上运行。
回答
1在代码中放入一些调试日志(当然包括时间戳),然后在调试器外部运行
2在调试器中再次运行
3重复多次,以获取统计上有效的数据。
4比较。
如果独立调试器与调试器的平均执行时间有显着差异,那么我们应该对操作系统保持怀疑态度(或者调试器的开销会钩住自己……)。如果没有差异,请不要流汗。
Edit0:显然,调试消息有一些开销。即使从调试器运行,我们也可能希望将它们保留在代码中。这样,独立程序和调试程序都运行相同的代码。
Edit1:我误解了这个问题。我以为我们担心的是-在调试时-操作系统可能比正常执行模式更频繁地中断应用程序。如果我们想知道应用实际花费了多少时间,只需将花费的时间与任务管理器中的" CPU时间"进行比较即可。
Edit2:将GetProcessTimes为过程返回的时间与实际执行时间进行比较。区别在于CPU在其他人身上花费的时间。
回答
@Kogus:即使我在调试器(从命令提示符下运行独立应用程序)外部运行,它仍可能被操作系统抢占,并导致对我的应用程序消耗的时间进行错误的度量。
是不是
-广告
回答
最好的方法是使用专用的分析工具。那里有很多东西。几年来我一直没有使用C语言,希望其他人能够提供更好的建议。当我们使用Visual Studio 2005时,这可能是一个不错的起点:
AQ,但我从未使用过。
回答
我认为我们在粒度方面会遇到一些问题。看到类似的问题GetLocalTime()API时间分辨率和gettimeofday()是否保证为微秒分辨率?
另外,我们可能想看看Windows资源工具包工具,其中包括timeit.exe(类似于unix / linux上的" time"),以提供经过时间和处理时间。