[英]Array VS Pointers
我有一个类似的课程:
class node{// case 1
float points[maxCap][d];
...
}
我也可以这样做:
class node{// case 2
float** points;
node(){
points = (float**)malloc(maxCap*sizeof(float*));
if(points)
for(int i=0; i<maxCapacity; i++)
points[i] = (float*)malloc(d*sizeof(float));
else{
cout<<"Unable to get memory"<<endl;
exit(1);
}
}
...
}
它们基本上是树中的节点。 我正在创建大约 500'000 到 1'000'000 个。
当我搜索一个点时,搜索算法中的每一件事都是相同的,情况 2 比情况 1 慢大约 0.2 秒(平均超过 3 次运行——尽管时间或多或少相同)所有 3 次运行)。 案例 1 的时间约为0.88s
而案例 2 的时间约为1.07s
。 有人可以告诉我这里发生了什么吗? 这不应该大致相同吗?
不幸的是,您没有提供进行实际搜索的代码。 但是,假设搜索实际上需要访问points
内/后面的数据,问题就很明显了:
使用数组,数据直接存储在node
对象中,并执行简单的指针运算来推导出points[a][b]
。 从内存中实际获取值只需要一次内存访问。
使用指针方法,节点只包含存储地址数组的地址。 因此, points
从内存中加载一个指针值, points[a]
从内存中加载第二个指针值, points[a][b]
最后将实际值加载到 CPU 中,准备进行比较。 这是三个内存访问,在数组情况下一个就足够了。
即使您的缓存和预取在减轻额外内存访问的影响方面做得很好,单个内存访问的性能也很容易超过三个。
考虑points[1][2]
。
后跟float** points;
指针数量是原来的两倍float** points;
比float points[10][3];
.
作为草图,它是:
float* inner = *(points + 1);
float result = *(inner + 2);
与
float result = *(points + (3 * 2) + (1));
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.