据这个Quora论坛称,
最简单的经验法则之一是记住,硬件喜欢数组,并且是对数组的迭代进行高度优化的。许多问题的一个简单的优化就是停止使用花哨的数据结构,而只使用普通数组(或C++中的std::vectors )。这需要一些时间去适应。
C++类是那些“花哨的数据结构”之一,即一种可以被数组取代的数据类型,以在C++程序中获得更高的性能吗?
发布于 2020-09-01 17:15:02
如果您的班级是这样的:
struct Person {
double age;
double income;
size_t location;
};那么你可能会从重新安排到
std::vector<double> ages;
std::vector<double> incomes;
std::vector<size_t> locations;但这取决于你的访问模式。如果您一次经常访问一个人的多个元素,那么将这些元素阻塞在一起是有意义的。
如果您的班级是这样的:
struct Population {
std::vector<double> many_ages;
std::vector<double> many_incomes;
std::vector<size_t> many_locations;
};然后您将使用您的资源推荐的表单。单独使用这些数组中的任何一个都比使用第一个类要快,但是同时使用所有三个数组中的元素可能要慢一些。
最终,您应该尽可能地构造您的代码以保持简洁和直观。最大的速度来源将是强大的理解和适当使用算法,而不是内存布局。我建议你忽略这一点,除非你已经有很强的高性能控制技能,并且需要从你的机器中榨取最大的性能。在几乎所有其他情况下,您的开发时间和理智都比节省几个时钟周期更有价值。
更广泛地说是
上面应该展示的是,即使在我们只有几个数组的情况下,就像您的资源所建议的那样,布局本身并不能给我们速度。好的算法就行。数据布局方面的考虑,如果有的话,来自我们选择的算法和更高层次的硬件约束.
如果对于简单的数组和像矩阵乘法这样的操作是这样的,那么你也应该期望它也适用于“花哨的数据结构”。
发布于 2020-09-01 17:05:55
C++类是那些“漂亮的数据结构”之一吗?
我认为它们特别指的是std::map、std::deque、std::list等容器,它们在许多不同的堆分配中保存数据,因此迭代容器的内容需要CPU在某种程度上“跳跃”在RAM地址空间中,而不仅仅是按顺序读取RAM。通常限制性能的是跳转,因为CPU的车载内存缓存在避免执行方面不太有效,因为当未来的RAM访问位置难以预测时,由于RAM延迟而延迟。
C++类本身可能鼓励也可能不鼓励非顺序RAM访问;它是否这样做完全取决于类是如何实现的(特别是取决于它是否通过多个堆分配保存其数据)。std::vector类(在论坛文本中提到)是一个C++类的例子,它在遍历其内容时不需要任何非顺序的内存访问。
发布于 2020-09-01 17:16:34
C++类是那些“奇特的数据结构”之一吗?
C++类是一个可用于创建数据类型的构造。它可以用于创建数据结构,如列表、队列等。
即一种数据类型
类是数据类型。
可以用数组替换的
类和数组不可互换。数组是数据结构。你在比较苹果和橘子。
为了在C++程序中获得更高的性能?
这取决于您如何实现类。
https://stackoverflow.com/questions/63692267
复制相似问题