这是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是计算索引)。
数组访问只发生一次,该函数从中获取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()是简单的内联函数。