我想对 C/C++ 代码进行基准测试。我想测量 CPU 时间、挂墙时间和周期/字节。我写了一些测量函数,但是周期/字节有问题。
为了获得 cpu 时间,我编写了一个函数getrusage()
,对于我使用的RUSAGE_SELF
壁时间,以获得我使用的周期/字节。clock_gettime
MONOTONIC
rdtsc
我处理大小为 1024: 的输入缓冲区char buffer[1024]
。我如何进行基准测试:
- 做一个热身阶段,简单地调用
fun2measure(args)
1000 次:
for(int i=0; i<1000; i++)
fun2measure(args);
然后,针对挂钟时间做一个实时基准测试:
`无符号长我; 双倍时间;双倍时间总计 = 3.0;// 处理 3 秒
for (timeTaken=(double)0, i=0; timeTaken <= timeTotal; timeTaken = walltime(1), i++) fun2measure(args); `
对于 cpu 时间(几乎相同):
for (timeTaken=(double)0, i=0; timeTaken <= timeTotal; timeTaken = walltime(1), i++) fun2measure(args);
但是当我想获得函数的 cpu 循环计数时,我使用这段代码:
`unsigned long s = cyclecount();
for (timeTaken=(double)0, i=0; timeTaken <= timeTotal; timeTaken = walltime(1), i++)
{
fun2measure(args);
}
unsigned long e = cyclecount();
unsigned long s = cyclecount();
for (timeTaken=(double)0, i=0; timeTaken <= timeTotal; timeTaken = cputime(1), i++)
{
fun2measure(args);
}
unsigned long e = cyclecount();`
然后,计数周期/字节:((e - s) / (i * inputsSize);
。这里inputsSize
是 1024,因为它是buffer
. 但是当我升到totalTime
10 岁时,我得到了奇怪的结果:
10 秒:
Did fun2measure 1148531 times in 10.00 seconds for 1024 bytes, 0 cycles/byte [CPU]
Did fun2measure 1000221 times in 10.00 seconds for 1024 bytes, 3.000000 cycles/byte [WALL]
5秒:
Did fun2measure 578476 times in 5.00 seconds for 1024 bytes, 0 cycles/byte [CPU]
Did fun2measure 499542 times in 5.00 seconds for 1024 bytes, 7.000000 cycles/byte [WALL]
4s:
Did fun2measure 456828 times in 4.00 seconds for 1024 bytes, 4 cycles/byte [CPU]
Did fun2measure 396612 times in 4.00 seconds for 1024 bytes, 3.000000 cycles/byte [WALL]
我的问题:
- 这些结果好吗?
- 为什么当我增加时间时,我总是在 cpu 中得到 0 个周期/字节?
- 我如何测量此类基准测试的平均时间、平均值、标准偏差等统计数据?
- 我的基准测试方法 100% 可以吗?
干杯!
第一次编辑:
更改i
为后double
:
Did fun2measure 1138164.00 times in 10.00 seconds for 1024 bytes, 0.410739 cycles/byte [CPU]
Did fun2measure 999849.00 times in 10.00 seconds for 1024 bytes, 3.382036 cycles/byte [WALL]
我的结果似乎还可以。所以问题#2不再是问题了:)