【发布时间】:2010-11-15 08:35:17
【问题描述】:
我的代码的瓶颈部分存在性能问题。基本上它是一个简单的嵌套循环。
分析问题表明程序花费大量时间来增加循环计数器 (++) 和测试终止 (i/j
观察程序集输出,我发现两个计数器都没有获取寄存器并且访问它们会花费很多周期。使用“register”关键字并不能说服编译器将它们实际放入寄存器中。有什么办法可以优化计数器的访问时间吗?
这是汇编输出。 C 源代码只是一个带有 i/j 计数器的简单嵌套循环。
2738 0.2479 2459 0.1707 : 1e6c: jne 1dd1 <process_hooks+0x121>
1041 0.0942 1120 0.0778 : 1e72: addl $0x1,0xffffffd4(%ebp)
2130 0.1928 2102 0.1459 : 1e76: cmpl $0x8,0xffffffd4(%ebp)
2654 0.2403 2337 0.1622 : 1e7a: jne 1da0 <process_hooks+0xf0>
809 0.0732 814 0.0565 : 1e80: jmp 1ce2 <process_hooks+0x32>
根据要求,这里也是 C 代码。编译器是 gcc 顺便说一句:
for (byte_index=0; byte_index < MASK_SIZE / NBBY; byte_index++)
{
if (check_byte(mask,byte_index))
{
for (bit_index=0; bit_index < NBBY; bit_index++)
{
condition_index = byte_index*NBBY + bit_index;
if (check_bit(condition_mask,condition_index))
{
.
.
.
}
}
}
}
谢谢
【问题讨论】:
-
您能否将代码也发布在 C 中,以便理智的编码人员也能理解问题所在?
-
真的,代码可能包含一些内容,使得不为计数器分配寄存器是完全合理的。
-
另外,您是否构建了具有全面优化的“发布”配置?
-
为什么只有-O2?使用 -O3 -Wall -Wextra :)
-
您是否在 gcc 选项中指定了处理器(-mtune=cpu-type -march=cpu-type)?也许您有一个带有大量寄存器的全新处理器,但 gcc 避免使用所有这些寄存器以使可执行文件在旧硬件上更具可移植性...
标签: c optimization compiler-construction