为什么 vsperfmon 告诉我被调用函数的包含时间比根函数的包含时间更长?
Why does vsperfmon tell me the called function's inclusive time is taking longer then the root function's?
因此,我一直在VS 2010中通过vsperfreport/vsperfcmd命令行工具试用vsperfmon。我构建了一个非常简单的程序来分析并试图理解这些工具输出的数字:
void DoStuff()
{
double res = 0.0;
for (double i = 0.0; i < 10000.0; ++i)
{
res += sin(i);
}
printf("res is %lf", res);
}
int _tmain(int argc, _TCHAR* argv[])
{
DoStuff();
return 0;
}
我通过运行命令行中详细介绍的步骤来评测可执行文件。上面的代码被编译成perfPlay.exe,然后我做以下步骤:
vsinstr perfPlay.exe
vsperfcmd /start:trace /output:perfPlay.vsp
perfPlay.exe
vsperfcmd /shutdown
vsperfreport perfPlay.vsp /output:singleFile /summary:All
有一件奇怪的事我想不通。DoStuff经过的包含时间小于函数和调用者/被调用者报告中sin()的包含时间:以下是DoStuff()的调用者/被调用者报告,请注意THUNK:sin与根函数的Elapsed Inclusive Time
类型函数名称占用的非独占时间占用的独占时间根DoStuffInLib(无效)2157487 0呼叫者_wmain 2157487 0 2157487被叫__RTC_CheckEsp 57 57被叫方打印347667 347667被叫THUNK:sin 2282622 81435
运行时间定义为执行函数中的代码所花费的时间,包括您调用的函数。根据这个定义,DoStuff的包含时间应该总是>罪恶的包含时间。上面的差异相对较小,但如果我让这个东西运行一段时间,它会变大。这种差异在调试和发布模式中都存在。
为什么罪的包容时间更高?我希望它能代表根条目的一部分时间。我不太确定发生了什么,甚至不确定我是否可以信任这个工具,如果它能做一些看似奇怪的事情。不过,我怀疑我只是错过了一些能让事情变得更清楚的东西。
性能监视器使用探测来收集数据。它试图从收集的数据中减去自己的探测器所花费的时间,但这种校正是近似的,并且通常会在一个方向或另一个方向上持续偏离。通常,您试图探测的函数越小,测量就越不准确,因为收集数据所花费的时间占所用时间的百分比越高。
相关文章:
- C++为构建时间获取QDateTime的可靠方法
- 如何导出包含具有"std::unique_ptr"值的"std::map"属性的
- 从持续时间构造std::chrono::system_clock::time_point
- 如何将包含epoch时间的十六进制字符串转换为time_t
- 我可以创建一个包含两个变量的 for 循环,但时间复杂度仍然为 O(n) 吗?
- 求解包含"variables"的 T(n) 时间复杂度
- 为什么具有静态存储持续时间的同一内联变量在包含在 VS2017 编译的两个翻译单元中时会构造和销毁两次
- 包含每个 k 个列表中至少 1 个元素的最小元素范围的时间复杂度
- 如何减少编译时间:在包含未触及的头文件的情况下
- 包含iostream时的自定义类时间的错误实例
- 生成包含分数和时区的完整 iso 日期时间表示字符串
- 无法创建包含日期和时间的文件名(C++)
- 如何将包含 64 位纪元时间的字符串转换为人类可读格式
- 生成一个包含时间的短字符串,结果很奇怪
- 如何在 c++ 中将包含时间的字符串变量转换为time_t类型
- C++ 将包含 UTC 日期和时间的字符串转换为 TM 结构
- VSPerfReport:独占时间等于包含时间
- 需要包含运行任务时间的 2D 矩阵的最佳解决方案
- 为什么 vsperfmon 告诉我被调用函数的包含时间比根函数的包含时间更长?
- 用C++从包含日期和时间的字符串构造ISO8601日期