【问题标题】:How to measure total time spent in a function?如何测量函数花费的总时间?
【发布时间】:2014-05-25 21:35:55
【问题描述】:

我有一个实用程序函数,我怀疑它占用了我的应用程序的大部分执行时间。使用 Time Profiler 查看调用堆栈,此函数占用了调用它的任何函数的大部分执行时间。然而,由于这个实用函数是从许多不同的来源调用的,所以我很难确定总体上这是否是我优化时间的最佳利用。

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

为了清楚起见,我想将所选条目与对该函数的所有其他调用组合成一个条目:

【问题讨论】:

  • 您是否必须灵活并愿意向罪魁祸首函数添加一些代码并将结果记录在调试器中,或者您想要一个仅仪器的解决方案?
  • @paranoidcoder:我可以添加代码,但我喜欢仅使用仪器的解决方案。

标签: xcode performance instruments


【解决方案1】:

我认为你可以调用 system("time ls");两次,它只会为你工作。输出将打印在调试控制台上。

【讨论】:

    【解决方案2】:

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

    复选框可以在右侧面板中找到,称为“显示设置”(如果隐藏:⌘2 或查看->检查器->显示显示设置)

    【讨论】:

    • 哇,这里有很多完全不同的答案!但这是正确的。
    【解决方案3】:

    我可以提供您正在寻找的答案,但还没有在 Instruments 中工作...

    Instruments 在后台使用dtracedtrace 允许您响应程序中的事件,例如输入或返回的函数。可以编写对每个事件的响应。

    您可以在 Instruments 中使用脚本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 中。

    【讨论】:

      【解决方案4】:

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

      1. 使用 Time Profiler 分析您的程序
      2. 在调用树视图中查找并选择任何提及感兴趣的函数(您可以使用编辑->查找)
      3. 在所选函数上调用上下文菜单和“关注调用者”(或使用仪器->调用树数据挖掘->关注调用者)

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

      【讨论】:

        【解决方案5】:

        我不知道基于仪器的解决方案,但您可以通过代码执行以下操作。希望有人提供仪器解决方案,但在那之前让你继续前进。

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

        【讨论】:

        • +1,感谢您的帮助。不过,我暂时不会接受,因为我仍然希望在 Instruments 中有办法。
        猜你喜欢
        • 1970-01-01
        • 2010-09-23
        • 2010-12-13
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2014-03-29
        • 1970-01-01
        相关资源
        最近更新 更多