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

标签 c glibc

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

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

最佳答案

我不知道为什么它在你的另一台运行 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;
}

关于c - 导致 if_nametoindex() 变慢的可能原因是什么?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/13482387/

相关文章:

c - 如何检查dlsym中函数指针的返回值?

c - fgetc内部如何工作

linux - 不同的程序是从公共(public)堆还是从单独的堆获取内存?

c - 如何在 c-未定义的引用中将 strlcpy 链接到 `strlcpy'

c - C 中宏中的宏

c++ - 线程缓存对象引用

c - C 中嵌套 for 循环的非常奇怪的问题,数据不一致

c++ - 素描圆柱体

c - 打印矩阵

c - 如何在启动时从共享库加载所有符号?