小编典典

哪个更快?“结构的向量”还是“多个向量”?

algorithm

解决方案1: 如果我有类似的课程,

class car{ public: int a; string b; bool c;};

我可以建立200辆汽车的向量:

std::vector<car>   allcas;  
allcars.resize(200)

在运行时,我只是这样做:

this_car=allcars[102];

然后 ....

解决方案2:

我有

std::vector<int> a; a.resize(200);
std::vector<string>b; b.resize(200);
std::vector<bool> c; c.resize(200);

this_car_a = a[102];
this_car_b = b[102];
this_car_c = c[102];

问题:哪个更快?

有人有主意吗?提前非常感谢!


阅读 346

收藏
2020-07-28

共1个答案

小编典典

与“结构的向量”相比,“向量的结构”具有几个优点:

  • 如果您的内部循环没有使用该结构的每个元素,那么向量结构可以节省内存带宽,因为未使用的元素向量不会加载到缓存中。
  • 向量化更容易。向量结构可以使您使用处理器的向量处理指令(通过汇编,内在函数或巧妙的编译器)来加快内部循环。

另一方面,过早的优化是万恶之源:

  • 使用向量结构更加困难,尴尬和模糊。
  • 在您没有启动代码并运行之前,您通常不知道性能瓶颈在哪里。是否值得使您的代码更加冗长,脆弱和困难?直到您真正配置它,您才知道。
  • 向量结构编程的好处因情况而异。它并不总是产生加速。最终可能会导致性能下降。
  • 特别是,如果您的访问模式是随机的(相对于顺序访问或本地化访问而言),那么向量结构组织可能最终会从内存中加载 更多 无用的数据,如果每个缓存行都包含来自多个附近对象的元素…

因此,我的建议是默认使用向量结构,但请牢记向量结构作为替代(即,如果您希望使用顺序/本地访问模式,请确保稍后可以切换,但不要这样做)花费很多精力)。程序运行后,您可以对其进行概要分析,以查看对性能至关重要的部分的位置,并尝试使用向量结构和向量化操作来发挥最大作用。

2020-07-28