在我的测试常规linux盒子(内核3.4)上,它运行得非常快。但是当我将程序移动到另一个linux盒子(内核3.0)时,这个函数运行速度非常慢,返回需要大约2.5ms,这就像500x慢,这会导致很大的性能问题。
那可能是造成这么大差异的可能原因呢?
答案 0 :(得分:0)
我不知道为什么在运行Linux 3.0的其他机器上运行速度会慢得多;有许多可能的原因,例如内核中的错误或一些缓慢的硬件。你可以凭经验确定这个。首先,看看问题是否是内核版本;在较慢的机器上安装较新的内核,看看是否修复了它。如果你不能这样做,你可以尝试在dev机器上安装旧内核。如果结果是基于内核版本,那么你可以将内核历史记录一分为二,以确定哪个提交加速了这么多。有关如何进行二分的详细信息,请参阅git bisect
。如果它不是内核问题,则可能是硬件问题。
无论引入了什么错误,您都希望修复它。如果您无法通过升级内核来修复它,可以通过调用if_nameindex()
一次,存储结果并在该数组中查找结果来解决它。以线性方式扫描大约15个项目的数组应该非常快;比2.5毫秒快得多。
struct if_nameindex* cached_nameindex = NULL;
int if_nametoindex_cached(char *name) {
if (!cached_nameindex) {
cached_nameindex = if_nameindex();
if (!cached_nameindex) {
perror("failed to get nameindex");
exit(1);
}
}
for (struct if_nameindex *ni = cached_nameindex; ni->if_name; ++ni) {
if (!strcmp(ni->if_name, name))
return ni->if_index;
}
return 0;
}