C++ 优化成员阵列访问(mov指令)
以下是性能分析器报告的一部分:C++ 优化成员阵列访问(mov指令),c++,optimization,gcc,assembly,C++,Optimization,Gcc,Assembly,以下是性能分析器报告的一部分: for (node* p = array[index]; p != NULL; p = p->next ) 52,55 : cb40a: mov (%edi,%edx,4),%ebp 正如您所看到的,在该函数中花费的一半时间用于表示“p=array[index]”访问的特定指令(%edi是“this”指针,%edx是计算索引) 为什么要花这么长时间?循环中有调用和比较,但大部分时间都花在这个执行一次的简单mov上
for (node* p = array[index]; p != NULL; p = p->next )
52,55 : cb40a: mov (%edi,%edx,4),%ebp
正如您所看到的,在该函数中花费的一半时间用于表示“p=array[index]”访问的特定指令(%edi是“this”指针,%edx是计算索引)
这里的key()和compare()是简单的内联函数。是否可以先尝试预取数组?(类似于,
\u内置预取(数组,0,3);
在函数中使用它之前的某个地方?嗯,如果函数只需要访问数组一次,并且只需要从数组中访问单个元素(开始节点),这会有帮助吗)?您是否确定mov
是通过索引到数组
生成的。如果gcc没有将p
初始化到适当的元素,我会感到惊讶。mov
语句可能来自p=p->next
。我觉得这不大可能,您能发布一个可编译的示例来说明您真正在做什么吗ng?也许大多数数组项已经是nullptr
,即空列表?否,p->next通过lea 0xc(%ebp),%eax完成。
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;
}