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

时间:2015-06-13 02:55:14

标签: c++ linux algorithm performance ipc

我有一个名为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);

2 个答案:

答案 0 :(得分:1)

我想建议一个简单的方法,而不是创建一个独立测量功能时间和做那些花哨/复杂东西的功能。

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

    做点什么

    logger.info(时间)

    {   id生成 }

    logger.info(时间)

    做点什么

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

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

    1. 您可以在程序的开头和结尾添加记录器,并限制程序仅在修复持续时间内执行(使用计时器或手动停止程序使用逻辑中断)
    2. 如果在x秒程序中生成y ids,那么, 在1秒内程序生成y / x ID

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

      我希望我能提供帮助。

答案 1 :(得分:0)

使用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秒并且已经做了大约137​​86208.所以如果这个函数已经在循环中运行了一秒钟,则会被称为13786208 / 3.72

示例来自此link