导致if_nametoindex()变慢的可能原因是什么?

时间:2012-11-20 21:22:46

标签: c glibc

在我的测试常规linux盒子(内核3.4)上,它运行得非常快。但是当我将程序移动到另一个linux盒子(内核3.0)时,这个函数运行速度非常慢,返回需要大约2.5ms,这就像500x慢,这会导致很大的性能问题。

那可能是造成这么大差异的可能原因呢?

1 个答案:

答案 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;
}