2014-04-11 39 views
6

我有一个实用功能,我怀疑是吃了我的应用程序的执行时间的很大一部分。使用Time Profiler查看调用堆栈,该函数占用调用它的任何函数的大部分执行时间。但是,由于此实用程序函数是从许多不同的来源调用的,因此我总是无法确定这是否是我的优化时间的最佳使用。如何衡量在一个函数中花费的总时间?

无论谁打电话,我如何查看程序执行过程中花费在此函数上的总时间?

为清楚起见,我想与所有其他调用该函数的选定条目合并为一个条目: Profiler Log

+0

您是否需要灵活性并将一些代码添加到罪魁祸首功能中,并将结果记录在调试器中,或者您想要一个仅仪器解决方案? – SayeedHussain

+0

@paranoidcoder:我可以添加代码,但我会喜欢仅限于仪器的解决方案。 – user664939

回答

2

我不知道基础的解决方案的工具,但这里是你可以从代码做。希望有人提供仪器解决方案,但在此之前,让你去这里去。

#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. 
+0

+1,感谢您的帮助。尽管如此,我现在还是坚持接受,因为我仍然希望乐器中有一种方法。 – user664939

1

我可以提供答案的,你要寻找的气质,但没有得到内仪器这方面的工作尚未...

仪器使用dtrace引擎盖下。 dtrace允许您响应程序中的事件,例如正在输入或返回的函数。对每个事件的响应都可以编写脚本。

你可以create a custom instrument在Instruments中使用脚本。

这是一个noddy shell脚本,在仪器之外启动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的有效途径。

2

要查看特定功能的总和,请按照下列步骤操作:

  1. 简介你的程序与时间探查
  2. 查找并选择在调用树视图感兴趣的功能的任何提及(你可以使用编辑 - >查找)
  3. 召唤上下文菜单上选择的功能和“关注通过拨打的电话”(或使用仪器 - >调用树数据Mining->聚焦拨打的通过)

如果您的程序是多线程的,并且您希望跨所有线程使用总数,请确保未选中“按线程分隔”。

6

对我来说,诀窍是勾选“反转调用树”。它似乎按照那些累积最多时间的顺序对调用树中的“叶”函数进行排序,并允许您查看调用它们的内容。

的复选框,可以在右侧面板中可以发现,所谓的“显示设置”(如果隐藏:⌘2或查看 - >的审查员>显示显示设置)

0

我想你可以调用系统(“时间LS “);两次,它只会为你工作。输出将打印在调试控制台上。

相关问题