面向数据的设计
维基百科,自由的百科全书
(从面向数据的设计中重定向)
跳转到导航跳转到搜索
不要与数据驱动的编程相混淆。
在计算中,面向数据的设计是一种程序优化方法,其有效利用是在视频游戏开发中使用的CPU缓存。[1]方法是专注于数据布局,根据需要对字段)进行分离和排序,并考虑数据的转换。支持者包括Mike Acton [2]和Scott Meyers [3]。
内容
- 1动机
- 2与面向对象的对比
- 3种编程语言
- 4另请参见
-
动机
这些方法在包括PlayStation 3(PS3)和Xbox 360在内的第七代视频游戏机中特别流行。从历史上看,与顶级台式计算机相比,游戏机通常具有相对较弱的中央处理器(CPU)。这是一个设计选择投入更多的功率和晶体管预算到图形处理单元(GPU)的。例如,第7代CPU并非使用现代的无序执行处理器制造,而是使用具有高时钟速度和深流水线)的有序处理器。另外,大多数类型的计算系统的主存储器位于距处理元件数百个时钟周期的位置。因此,如CPU已经变得更快和主存储器容量大得多,存在着发生,只有增加的电位发生巨大的数据消费冯·诺伊曼瓶颈,那里有高速缓存未命中的共享总线。因此,参考方法的局部性已用于控制性能,需要改进内存访问模式以解决瓶颈。一些软件问题也与Itanium上遇到的问题类似,需要循环展开才能进行前期调度。
与面向对象的对比
声称传统的面向对象编程(OOP)设计原理会导致较差的数据局部性,如果使用运行时多态性(动态调度)则更是如此(这在某些处理器上尤其成问题)。[4] [5]尽管OOP似乎确实是“围绕数据组织代码”,但实践却大不相同。OOP实际上是围绕数据类型组织源代码,而不是以有效地通过特定功能访问的格式对各个字段和数组进行物理分组。它还经常将布局细节隐藏在抽象层下,而面向数据的程序员则要首先考虑这一点。
编程语言
由乔纳森·布洛(Jonathan Blow)开发的实验性编程语言JAI对避开传统OOP范例的面向数据的设计提供了明确的支持。通过能够在记录)之间透明地移动字段而无需使用它们来对功能进行大量更改(或无需使用广泛的样板代码来实现此功能),并通过添加对数组结构(SoA)数据布局的直接支持,可以简化此操作。[6]
另请参阅
- CPU缓存
- 数据驱动的编程
- 内存访问模式
- 统一点
- 电子游戏开发
参考
- ^ “面向数据的设计” (PDF)。
- ^ “ CppCon 2014:Mike Acton“面向数据的设计和C ++ ” “。
- ^ “代码::潜水会议2014-斯科特迈耶斯:Cpu缓存和为什么您关心”。
- ^ “面向对象设计有什么问题?它的危害在哪里?” 。描述虚拟函数调用的问题,例如,i-cache未命中
- ^ “面向数据的设计-为什么您可能会用OOP射击自己”。
- ^ “面向数据的演示:SOA,构成”。用JAI语言演示了面向数据和SOA的功能,并解释了动机。
