1

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

那么造成如此大差异的可能原因是什么?

4

1 回答 1

0

我不知道为什么在你的另一台运行 Linux 3.0 的机器上它会慢得多;有很多可能的原因,例如内核中的错误或某些慢速硬件。您可以凭经验确定这一点。首先,看看是不是内核版本的问题;在速度较慢的机器上安装较新的内核,看看是否可以修复它。如果你不能这样做,你可以尝试在你的开发机器上安装旧内核。如果事实证明它是基于内核版本的,那么您可以将内核历史一分为二,以找出哪个提交加快了它的速度。有关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;
}
于 2012-11-20T23:09:34.753 回答