我有一个名为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);
答案 0 :(得分:1)
我想建议一个简单的方法,而不是创建一个独立测量功能时间和做那些花哨/复杂东西的功能。
在id生成模块的开头和结尾添加记录器/计时器,如
做点什么
logger.info(时间)
{ id生成 }
logger.info(时间)
做点什么
记录器是出于示例目的(通常是实现时间戳的最简单方法) 这将帮助您找到生成一个ID所需的时间 基于此,我希望时间是毫秒/微秒(如果它是微观的,那么你需要使用微秒粒度的定时器)。
如果你需要x毫秒来生成1个id,那么你将在一秒内生成round(1000 / x)id。这是一个简单的等式。
如果在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秒并且已经做了大约13786208.所以如果这个函数已经在循环中运行了一秒钟,则会被称为13786208 / 3.72
示例来自此link