-1

使用 Intel Vtune 分析数据包处理应用程序。

仅此指令中的时间利用率低

add $0x100, %r8 (7%)

单次if检查时间利用率低

if(unlikely(VALUE == some_value)

这个 some_value 是 uint16_t 并作为 (int*)&some_value 传递,如果有帮助,可以作为 (uint8_t*)some_value 进一步访问。

映射到以下

movzxw 0x3e(%rsp),%eax
test %ax,%ax ---- Leads in poor time utilization
jz Block x

将变量推送到堆栈的函数中的时间利用率低,而其他函数推送相同的变量并占用更少的时间

pushq %r15
pushq %r14
pushq %r13
pushq %r12
pushq %rbp
pushq %rbx 
sub $0x48, %rsp
movq %rsi, 0x18(%rsp)

在内存访问分析、分支错误预测分析等中显示相同的问题。不明白如何克服这个问题

4

1 回答 1

1

英特尔性能计数器不是周期精确的。有时附近的指令会获取不同指令中停顿的周期计数。(附近 = 1 或 2 条指令)。

除非存在一些非常奇怪的解码瓶颈,否则add $0x100, %r8相对于附近的其他指令而言,实际上不可能花费大量时间。除非它因为%r8在它准备好之前需要价值而受到抨击,也许吧。IDK 如果性能计数器以这种方式工作。

test / jz对宏融合成一个微指令。时间不是来自test,而是可能来自分支。是不是误判了很多?

慢推变量:该函数是递归的吗?还是在长调用链的末端?如果它将值推送到一段时间未触及的内存的缓存行(或更糟糕的页面)中,则它将不在 L1 缓存中并且访问速度会很慢。

在所有情况下,都需要更多的上下文才能说出任何确定的内容。一条指令本身对于性能分析几乎没有用处。

于 2015-06-25T14:04:19.070 回答