如何衡量应用程序每秒可以产生多少结果
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 操作,我想推荐一种简单的方法。
在您的 ID 生成模块的开头和结尾添加 logger/timers,例如,
做点什么
logger.info(时间)
{
代号
}
logger.info(时间)
做点什么
记录器用于示例目的(通常是实现时间戳的最简单方法)
这将帮助您找到生成一个 id 所需的时间
基于此,我希望时间在 millis/micros 内(如果它在微内,那么您需要使用具有微秒粒度的计时器)。
如果您需要 x 毫秒来生成 1 个 id,那么您将在一秒钟内生成 round(1000/x) 个 id。这是一个简单的等式。
- 您可以在程序的开始和结束处添加记录器,并限制程序只执行固定的持续时间(使用定时器的逻辑中断或程序的手动停止)
如果程序在 x 秒内生成 y 个 ID,则
在 1 秒内程序生成 y/x 个 ID
运行 程序 2-3 次,持续时间足够长,以获得平均和准确度以获得程序的吞吐量。
希望对您有所帮助。
我有一个名为 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 操作,我想推荐一种简单的方法。
在您的 ID 生成模块的开头和结尾添加 logger/timers,例如,
做点什么
logger.info(时间)
{ 代号 }
logger.info(时间)
做点什么
记录器用于示例目的(通常是实现时间戳的最简单方法) 这将帮助您找到生成一个 id 所需的时间 基于此,我希望时间在 millis/micros 内(如果它在微内,那么您需要使用具有微秒粒度的计时器)。
如果您需要 x 毫秒来生成 1 个 id,那么您将在一秒钟内生成 round(1000/x) 个 id。这是一个简单的等式。
- 您可以在程序的开始和结束处添加记录器,并限制程序只执行固定的持续时间(使用定时器的逻辑中断或程序的手动停止)
如果程序在 x 秒内生成 y 个 ID,则 在 1 秒内程序生成 y/x 个 ID
运行 程序 2-3 次,持续时间足够长,以获得平均和准确度以获得程序的吞吐量。
希望对您有所帮助。