如何衡量应用程序每秒可以产生多少结果

How to Measure How Many Results App Can Produce Per Second

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

现在,我想知道 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);

运行 使用像 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

我不想创建一个独立测量函数时间的函数并执行那些 fancy/complex 操作,我想推荐一种简单的方法。

  1. 在您的 ID 生成模块的开头和结尾添加 logger/timers,例如,

    做点什么

    logger.info(时间)

    { 代号 }

    logger.info(时间)

    做点什么

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

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

  1. 您可以在程序的开始和结束处添加记录器,并限制程序只执行固定的持续时间(使用定时器的逻辑中断或程序的手动停止)

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

运行 程序 2-3 次,持续时间足够长,以获得平均和准确度以获得程序的吞吐量。

希望对您有所帮助。