我有一个实用功能,我怀疑它占用了我应用程序的大部分执行时间。使用Time Profiler查看调用堆栈,此函数占用调用它的任何函数的大部分执行时间。但是,由于此实用程序功能是从许多不同的来源调用的,因此我无法确定总体而言,这是否是我的优化时间的最佳用途。
如何在程序执行期间查看在此函数中花费的总时间,无论是谁调用它?
为清楚起见,我想将所选条目与该函数的所有其他调用合并为一个条目:
答案 0 :(得分:7)
对我来说,诀窍是什么?#34; Invert Call Tree"。它似乎排序" leaf"调用树中的函数按累计时间的顺序排列,并允许您查看调用它们的内容。
可以在右侧面板中找到该复选框,称为"显示设置" (如果隐藏:⌘2或View-> Inspectors-> Show Display Settings)
答案 1 :(得分:3)
我不知道基于仪器的解决方案,但您可以从代码中做到这一点。希望有人提供仪器解决方案,但在此之前让你去这里。
#include <time.h>
//have this as a global variable to track time taken by the culprit function
static double time_consumed = 0;
void myTimeConsumingFunction(){
//add these lines in the function
clock_t start, end;
start = clock();
//main body of the function taking up time
end = clock();
//add this at the bottom and keep accumulating time spent across all calls
time_consumed += (double)(end - start) / CLOCKS_PER_SEC;
}
//at termination/end-of-program log time_consumed.
答案 2 :(得分:2)
我可以提供您正在寻找的答案,但尚未在乐器中使用......
乐器使用dtrace
。 dtrace
允许您响应程序中的事件,例如输入或返回的函数。每个事件的响应都可以编写脚本。
您可以create a custom instrument使用乐器中的脚本。
这是一个noddy shell脚本,它在Instruments之外启动dtrace并记录在某个函数中花费的时间。
#!/bin/sh
dtrace -c <yourprogram> -n '
unsigned long long totalTime;
self uint64_t lastEntry;
dtrace:::BEGIN
{
totalTime = 0;
}
pid$target:<yourprogram>:*<yourfunction>*:entry
{
self->lastEntry = vtimestamp;
}
pid$target:<yourprogram>:*<yourfunction>*:return
{
totalTime = totalTime + (vtimestamp - self->lastEntry);
/*@timeByThread[tid] = sum(vtimestamp - self->lastEntry);*/
}
dtrace:::END
{
printf( "\n\nTotal time %dms\n" , totalTime/1000000 )
}
'
我还没想到的是如何将其转换为工具并将结果以有用的方式显示在GUI中。
答案 3 :(得分:2)
要查看特定功能的总计,请按以下步骤操作:
如果您的程序是多线程的,并且您想要在所有线程中使用总计,请确保未选中“按线程分离”。
答案 4 :(得分:0)
我认为你可以打电话给系统(&#34;时间ls&#34;);两次,它只会为你工作。输出将打印在调试控制台上。