我正在用C ++和汇编代码完成我的第一个程序。我已经知道如何使用C ++编程,但是当我尝试使用汇编代码编程时,我遇到了很多问题。 我想做一个综合基准,
“旨在模仿组件或系统上的特定类型的工作负载。综合基准测试通过专门创建的程序来实现,这些程序将工作负载强加于组件上。” (维基百科)
例如,如果我想计算long fact = pow(3.0, 2000)
的阶乘,我如何衡量C ++中组件的性能? (而不是整个系统的表现)。
其余的代码(事实的计算)是在汇编代码中完成的。
答案 0 :(得分:0)
以下是我的一个基准测试(对于Linux)的一部分,它使用汇编代码,可以执行重复计算而不必担心过度优化。您需要使用具有基于汇编的循环的高分辨率计时器足够长的时间以获得合理的执行时间。您可能希望在循环中重复计算以填充管道。
这一次重复20M增加10次以找到最大速度。 IntCount1值最后被检查为简单的完整性检查
C Code
intCount1 = 0;
max = 0;
for (i=0; i<10; i++)
{
count = intCount1;
start_time();
_mips1Reg();
end_time();
count = intCount1 - count;
mips = (int)((double)count / 1000000.0 / secs + 0.5);
if(mips > max) max = mips;
}
mipsReg[0] = max;
printf(" 1 Register %7d 32 Bit Integer MIPS\n", mipsReg[0]);
########################################################
Hi-Res Timer Used
clock_gettime(CLOCK_REALTIME, &tp1);
theseSecs = tp1.tv_sec + tp1.tv_nsec / 1e9;
########################################################
Assembly Code
global _mips1Reg
_mips1Reg:
push eax
push ebx
push ecx
push edx
push edi
mov edi, 1000000
mov eax, [intCount1]
align 8
dlp:add eax, 1
add eax, 1
add eax, 1
add eax, 1
add eax, 1
add eax, 1
add eax, 1
add eax, 1
add eax, 1
add eax, 1
add eax, 1
add eax, 1
add eax, 1
add eax, 1
add eax, 1
add eax, 1
add eax, 1
add eax, 1
add eax, 1
add eax, 3
dec edi
jnz dlp
mov [intCount1], eax
pop edi
pop edx
pop ecx
pop ebx
pop eax
ret