【问题标题】:How to Measure How Many Results App Can Produce Per Second如何衡量应用程序每秒可以产生多少结果
【发布时间】:2015-06-13 02:55:13
【问题描述】:

我有一个名为 IDCreator 的 c++ 应用程序,它需要两个参数来生成 ID。它使用 printf ---- 将其返回值打印到 STDOUT ---- 调用进程从中获取。

现在,我想知道 IDCreator 每秒能够生成多少个 ID(必须在此应用程序之外完成),我该如何实现? 下面的代码适合做这样的工作吗?还有其他方法吗?

string getid;
getid.append("./IDCreator arg1 arg2");

int count = 0;    
const int PERIOD = 100;

const int LEN = 512;
char buff[LEN] = {0};

time_t tick1 = time(NULL);
while(1)
{
     time_t tick2 = time(NULL);
     if ((tick2 - tick1) > PERIOD)
         break;

     FILE* res = popen(cmd.c_str(), "r");
     if (res)
     {
           fgets(res, buff, sizeof(buf));
           pclose(res);

           count++;
     }
}

printf("Products Per Second is: %d", count/PERIOD);

【问题讨论】:

  • boost:timer 是我常用的。为什么它需要在程序之外完成?计时的东西几乎不会影响性能。
  • @twentylemon 因为它被封装在一个 exe 应用程序中,我所知道的只是使用 IPC 的调用。

标签: c++ linux algorithm performance ipc


【解决方案1】:

我不想创建一个函数来独立测量函数时间并做那些花哨/复杂的事情,我想建议一种简单的方法。

  1. 在 id 生成模块的开头和结尾添加记录器/计时器,例如,

    做点什么

    logger.info(时间)

    { 身份生成 }

    logger.info(时间)

    做点什么

记录器是例如目的(通常是实现时间戳的最简单方法) 这将帮助您找到生成一个 ID 所需的时间 基于此,我希望时间以毫秒/微秒为单位(如果它是微秒,那么您需要使用具有微秒粒度的计时器)。

如果您需要 x 毫秒来生成 1 个 id,那么您将在一秒钟内生成 round(1000/x) 个 id。这是一个简单的等式。

  1. 您可以在程序的开头和结尾添加记录器,并限制程序仅在固定时间段内执行(使用计时器进行逻辑中断或手动停止程序)

如果程序在 x 秒内生成 y 个 ID,那么, 在 1 秒内程序生成 y/x ids

在足够长的时间内运行程序 2-3 次,以获得平均值和准确性,从而获得程序的吞吐量。

希望我对您有所帮助。

【讨论】:

    【解决方案2】:

    使用 gprof 之类的分析器运行代码,您可以使用它来衡量每个函数的性能并据此得出结论。

    这是 gprof 的示例输出之一,

      %   cumulative   self              self     total           
     time   seconds   seconds    calls  ms/call  ms/call  name    
      17.7       3.72     3.72 13786208     0.00     0.00  Ns_DStringNAppend [8]
      6.1       5.00     1.28   107276     0.01     0.03  MakePath [10]
      2.9       5.60     0.60  1555972     0.00     0.00  Ns_DStringFree [35]
      2.7       6.18     0.58  1555965     0.00     0.00  Ns_DStringInit [36]
      2.3       6.67     0.49  1507858     0.00     0.00  ns_realloc [40]
    

    在上面的例子中,第 1 行本身已经运行了 3.72 秒,大约是 13786208。因此,如果这个函数单独在循环中运行了一秒,将被称为 13786208/3.72

    例子来自这个link

    【讨论】:

    • 我可以设置一个像“./IDCreator arg1 arg2”这样的调用方法,让gprof计算我们在一秒钟内可以有多少调用/ID?供参考。 IDCreator 是一个封装的应用程序,我们只能将其称为外部应用程序。
    猜你喜欢
    • 2010-09-27
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2011-06-11
    • 2018-09-09
    • 1970-01-01
    相关资源
    最近更新 更多