【问题标题】:Measuring new/old code CPU usages, on specific functions在特定功能上测量新/旧代码 CPU 使用率
【发布时间】:2012-12-31 21:34:47
【问题描述】:

长话短说,我正在重新编写一个非常耗 CPU 的应用程序,打算以一种完全不同的方式对其进行重组,并改变它的很多内部工作方式。我正在寻找一种比较新旧结果的好方法。

假设我首先更改函数 foo() 的工作方式:

我想让程序运行 60 秒,然后测量该函数在程序的总 CPU 使用率中使用的 CPU 百分比。如果它是恒定的 25%,我想知道这 25% 中有多少是我的功能。那我改代码后测试一下,有两个很好的指标说明我是否有很好的改进。

我已经尝试过Very Sleepy,但我无法访问我想要访问的功能;他们没有表现出来。我希望能够看到使用库函数 (SDL) 的我自己编码的函数的使用百分比,但它只会显示 SDL 函数。

【问题讨论】:

  • 已经由其他人完成了,很好。

标签: c++ windows function timer profile


【解决方案1】:

有几种不同的方法,其中一种是在函数的开始和结束处简单地添加一个高精度计时器调用。根据对函数的调用次数,您可以累积时间,例如:

 typedef type_of_time_source tt;
 tt total = 0;

 void my_func(....)
 {
     tt time = gettime();

     ... lots of your code ... 

     time = gettime() - time;
     total += time;
 }

或者您可以存储各个间隔,例如

 tt array[LARGE_NUMBER];
 int index = 0;


 ... same code as above ... 
     time = gettime() - time;
     if (index >= LARGE_NUMBER) index = 0; // [or LARGE_NUMBER-1?]
     array[index++] = time;

当然,如果您对 SDL 的调用是在您的函数中间进行的,那么您需要在那个时候以一种或另一种方式打折。

另一种方法是测量几个函数的单独时间:

 enum {
     FUNCA,
     FUNCB,
     ....
     MAX_TIMINGS
}

struct timing_val
{
    tt start, end;
    char *name;
}
struct timing_val timing_values[MAX_TIMINGS];

#define START(f)   do { timing_values[f].name = #f; timing_values[f].start = gettime(); } while (0);
#define END(f)  do { timing_values[f].end = gettime(); } while(0);

void report()
{
     for(int i = 0; i < MAX_TIMING; i++)
     {
           if (timing_values[i].start == 0 && timing_vlaues[i].end
                cout << timing_values[i].name <<< " time = " << 
                     timing_values[i].end - timing_values[i].start << endl;
     }
}

void big_function()
{
    START(FUNCA);
    funca();
    END(FUNCA);
    START(FUNCB);
    funcb();
    END(FUNCB)

    ... 

    report();
}

我当然已经使用了所有这些函数,而且只要函数相当大,运行时间长,它就不应该增加太多开销。

您还可以同时测量多个功能,例如如果我们想拥有整个函数,我们可以将枚举“BIG_FUNC”添加到上面的枚举列表中,然后这样做:

void big_function()
{
    START(BIG_FUNCTION);
    START(FUNCA);
    funca();
    END(FUNCA);
    START(FUNCB);
    funcb();
    END(FUNCB)

    ... 
    END(BIG_FUNCTION);
    report();
}

【讨论】:

  • 太完美了,谢谢!与程序本身相比,我如何测量 1 个(或多个)函数的时间?获得某种半准确的百分比值?我是否应该在程序启动后立即添加一个计时器,在程序结束时关闭计时器,然后执行 functionTime/programTime x 100?因为我在整个程序中也有 sleeps() ,它不会干扰吗?
  • 我从不真正担心总体时间,因为我通常只是使用 unix 命令“time”或类似命令粗略地测量它(时间给出了实时总时间以及用户和内核中的 CPU 时间模式,因此对于整体时间计算非常方便)。我将通过编辑在上面展示另一个小技巧...
  • 再次感谢您,仅此而已!有一个美好的新年! :)
猜你喜欢
  • 2013-04-13
  • 2011-04-07
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2017-10-09
  • 2021-12-17
  • 1970-01-01
相关资源
最近更新 更多