C++ 数据导向设计;如何优化c+中的数据结构+;为了表演?

C++ 数据导向设计;如何优化c+中的数据结构+;为了表演?,c++,caching,data-containers,C++,Caching,Data Containers,我希望有一个由数量不等的n个对象组成的类,这些对象很容易作为一个组进行迭代,每个对象成员都有一个影响类方法的单个修改变量的大列表(20+)。在开始学习OOP之前,我只需要制作一个2D数组,将变量值加载到每一行中,对应于每个对象,然后根据需要追加/删除行。这仍然是一个好的解决方案吗?有更好的解决办法吗 同样,在这种情况下,我更感兴趣的是提高处理器性能,而不是保留抽象性和模块性等。在这方面,我对数据容器最终读入一级缓存的方式以及如何确保不会导致页面效率低下或缓存未命中感到非常困惑。例如,如果我有一个

我希望有一个由数量不等的n个对象组成的类,这些对象很容易作为一个组进行迭代,每个对象成员都有一个影响类方法的单个修改变量的大列表(20+)。在开始学习OOP之前,我只需要制作一个2D数组,将变量值加载到每一行中,对应于每个对象,然后根据需要追加/删除行。这仍然是一个好的解决方案吗?有更好的解决办法吗

同样,在这种情况下,我更感兴趣的是提高处理器性能,而不是保留抽象性和模块性等。在这方面,我对数据容器最终读入一级缓存的方式以及如何确保不会导致页面效率低下或缓存未命中感到非常困惑。例如,如果我有一个128 kb的缓存,我假设整个容器都应该放入这个缓存中,这样才有效,对吗

> P> C++标准模板库效率较低,因为它广泛地使用动态内存分配。但是,一个固定大小的数组如果比需要的数组大(例如,因为在编译时不知道所需的大小),也可能对性能有害,因为较大的数组意味着它不容易放入缓存。在这种情况下,STL的动态内存分配可以执行得更好

通常,最好将数据存储在连续内存中。为此,可以使用固定大小的数组或
std::vector
。但是,在使用
std::vector
之前,您应该出于性能原因调用它,这样就不必经常重新分配内存。如果重新分配太频繁,堆可能会变得支离破碎,这对缓存性能也不利

理想情况下,您正在处理的数据将完全放入1级数据缓存(在现代桌面处理器上约为32KB)。但是,即使它不适合,2级缓存也要大得多(约512kb),3级缓存也有几兆字节。高级缓存仍然比从主存读取快得多

最好是您的内存访问模式是可预测的,这样就可以更好地工作。顺序内存访问对于硬件预取器来说是最容易预测的

如果您多次访问相同的数据,并且数据足够小,可以保存在缓存中,那么CPU缓存工作得最好。然而,即使数据只被使用一次,CPU缓存仍然可以通过使用内存来加快内存访问速度

如果发生以下情况,将发生缓存未命中:

  • 第一次访问数据时,硬件预取器无法及时预测和预取所需的内存地址,或者
  • 数据不再缓存,因为缓存必须为其他数据腾出空间,因为数据太大,无法放入缓存
  • 除了硬件预取器试图提前预测所需的内存地址(这是自动的),程序员还可以明确地发出软件预取。然而,从我所读到的,除了在非常特殊的情况下,很难从中获得显著的性能收益。根据

    < P>,C++标准模板库是相当低效的,因为它广泛地使用动态内存分配。但是,一个固定大小的数组如果比需要的数组大(例如,因为在编译时不知道所需的大小),也可能对性能有害,因为较大的数组意味着它不容易放入缓存。在这种情况下,STL的动态内存分配可以执行得更好

    通常,最好将数据存储在连续内存中。为此,可以使用固定大小的数组或
    std::vector
    。但是,在使用
    std::vector
    之前,您应该出于性能原因调用它,这样就不必经常重新分配内存。如果重新分配太频繁,堆可能会变得支离破碎,这对缓存性能也不利

    理想情况下,您正在处理的数据将完全放入1级数据缓存(在现代桌面处理器上约为32KB)。但是,即使它不适合,2级缓存也要大得多(约512kb),3级缓存也有几兆字节。高级缓存仍然比从主存读取快得多

    最好是您的内存访问模式是可预测的,这样就可以更好地工作。顺序内存访问对于硬件预取器来说是最容易预测的

    如果您多次访问相同的数据,并且数据足够小,可以保存在缓存中,那么CPU缓存工作得最好。然而,即使数据只被使用一次,CPU缓存仍然可以通过使用内存来加快内存访问速度

    如果发生以下情况,将发生缓存未命中:

  • 第一次访问数据时,硬件预取器无法及时预测和预取所需的内存地址,或者
  • 数据不再缓存,因为缓存必须为其他数据腾出空间,因为数据太大,无法放入缓存

  • 除了硬件预取器试图提前预测所需的内存地址(这是自动的),程序员还可以明确地发出软件预取。然而,据我所知,这样做很难获得显著的性能提升,除非是在非常特殊的情况下。

    我很想结束这篇文章,因为“需要细节和清晰”。您能否提供一个代码示例,说明您正在尝试执行哪些操作并对其进行优化?当您说每个对象成员都有一个包含20多个单独修改的变量的大列表时,重要的是要知道对于所有对象,该数字是否完全相同,以及这些变量的总大小是否固定。如果两者的数量相同