如何衡量在函数中花费的总时间?

时间:2014-04-11 16:07:21

标签: xcode performance instruments

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

如何在程序执行期间查看在此函数中花费的总时间,无论是谁调用它?

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

5 个答案:

答案 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)

我可以提供您正在寻找的答案,但尚未在乐器中使用......

乐器使用dtracedtrace允许您响应程序中的事件,例如输入或返回的函数。每个事件的响应都可以编写脚本。

您可以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)

要查看特定功能的总计,请按以下步骤操作:

  1. 使用Time Profiler配置您的程序
  2. 在“调用树”视图中查找并选择任何感兴趣的功能(您可以使用“编辑” - >“查找”)
  3. 在所选功能上召唤上下文菜单,并“关注所做的呼叫”(或使用“仪器” - >“呼叫树数据挖掘 - >关注所发出的呼叫”
  4. 如果您的程序是多线程的,并且您想要在所有线程中使用总计,请确保未选中“按线程分离”。

答案 4 :(得分:0)

我认为你可以打电话给系统(&#34;时间ls&#34;);两次,它只会为你工作。输出将打印在调试控制台上。