2013-07-04 60 views
0

上下文(尽管不是很重要),一个网络过滤模块中,我们使用结构,如:比较之前更新(memcpy之前的memcmp),或者只是更新,哪个性能更好?

struct data { 
    char mac[ETH_ALEN]; 
    char in6_addr addr; 
}; 

跟踪MAC地址和IPv6地址。

用于处理IPv6地址的变化:

  1. 我应该比较新老值(memcmp),如果不同,则更新(memcpy的)。
  2. 或者,我只是更新它。

两者都是有效的行为,所以表现是这里的主要关注点。

我发现了一个类似的问题:https://jira.mongodb.org/browse/SERVER-66

他们似乎选择了“只更新”的方式。

+0

发生这种情况的频率如何?它会对整体运行时间产生显着影响吗? –

+0

我们检查每个正在转发的数据包,以反映可能的地址更改,因此经常发生。 –

回答

1

最好的事情就是对它进行基准测试,看看是否有任何合理的区别,假设分配的地址类似于你获得的地址(也许你应该使用一些真实的数据)。

我唯一能想到的是如果你跳过一个分支选择(如果你避免拥有if (!memmcmp(..)),那么你会这样做),那么你就跳过了分支预测器失败的机会。

+0

确实。尽管您必须权衡这种不必要的缓存行失效的代价。 –

+0

少一个代码分支或不必要的缓存行失效?我们是否有一般的预测,或者我们必须在类似的情况下每次都进行基准测试。 –

相关问题