优化成员数组访问(mov指令)

时间:2012-12-07 11:50:17

标签: c++ optimization gcc assembly

这是perf profiler报告的一部分:

for (node* p = array[index]; p != NULL; p = p->next )
   52,55 :           cb40a:       mov    (%edi,%edx,4),%ebp

正如您所看到的,在该函数中花费的时间的一半花费在表示" p = array [index]"的特定指令上。访问(%edi是"这个"指针,%edx是计算索引)。

  1. 为什么需要这么长时间?在循环内部进行了调用和比较,但是大部分时间花在了这个简单的mov上。我想通常这个列表只包含很少的元素,因此循环体不需要太多时间,但仍然......
  2. 如何优化它?
  3. 数组访问只发生一次,该函数从中获取start元素。通常,该函数最终将节点数据与密钥进行比较并返回" p"如果比较失败,则为NULL。即大部分时间p-> next都是NULL。

    即使我们假设内存访问只发生两次:在数组[index]和p-> next中,那么为什么第一个比第二个慢得多(约为函数的5%)?

    如果这是缓存问题,我想知道它为什么会发生以及如何找到可能的解决方案(即重新安排内存访问等)。

    完整的功能(种类):

    node* list::find(int key)
    {
      if (!this->array) return 0;
      node* dummy = 0;
      int index = calcindex(key);
      for (node* p = this->array[index]; p != NULL; p = p->next)
      {
        if (p->key() == key && check(p->data, key))
          return p;
        dummy = p; // forgot to remove this stuff, probably optimized away
      }
      return 0;
    }
    

    这里key()和compare()是简单的内联函数。

0 个答案:

没有答案