什么是数据导向devise?

我正在阅读这篇文章 ,而这个人继续谈论如何人人都可以从面向数据的devise与面向对象的混合中受益匪浅。 但是他没有显示任何代码示例。

我GOOGLE了这一点,并没有find任何真正的信息,这是什么,更不用说任何代码示例。 有没有人熟悉这个术语,可以提供一个例子? 这可能是另外一个字吗?

首先不要把它和数据驱动的devise混为一谈。

我对数据导向devise的理解是关于组织数据进行高效处理。 特别是在caching失误等方面。另一方面,数据驱动devise是让数据控制你的许多程序行为( Andrew Keith的回答非常好的描述)。

假设您的应用程序中有球对象,并具有颜色,半径,弹性,位置等属性

面向对象的方法

在OOP中,你会描述你这样的球:

class Ball { Point position; Color color; double radius; void draw(); }; 

然后你会创build一个这样的球的集合:

 vector<Ball> balls; 

面向数据的方法

在面向数据的devise中,你更可能写这样的代码:

 class Balls { vector<Point> position; vector<Color> color; vector<double> radius; void draw(); }; 

正如你所看到的,没有一个单位代表一个球了。 球对象只能隐式存在。

这在性能方面可以有很多优点。 通常我们想同时在很多球上做操作。 硬件通常需要大量连续的内存块来高效运行。

其次,你可能会做只影响球属性的一部分的操作。 例如,如果以各种方式组合所有球的颜色,则希望caching仅包含颜色信息。 然而,当所有的球属性都存储在一个单位,你也将拉一个球的所有其他属性。 即使你不需要他们。

caching使用示例

说一个球每个球占用64个字节,一个点需要4个字节。 高速caching插槽也需要64个字节。 如果我想更新10个球的位置,我必须将10 * 64 = 640个字节的内存拉入caching,并获得10个caching未命中。 但是,如果我可以将球的位置作为单独的单位工作,那么只需要4 * 10 = 40个字节。 这适合一个caching提取。 因此我们只得到1个caching未命中以更新所有10个球。 这些数字是任意的,我假设caching块更大。

但它说明了内存布局如何对caching命中和性能造成严重影响。 随着CPU和RAM速度之间的差异的扩大,这只会增加重要性。

如何布置内存

在我的例子中,我简化了这个问题,因为通常对于任何普通的应用程序,你都可能访问多个variables。 例如位置和半径可能会经常一起使用。 那么你的结构应该是:

 class Body { Point position; double radius; }; class Balls { vector<Body> bodies; vector<Color> color; void draw(); }; 

你应该这样做的原因是,如果一起使用的数据被放置在单独的数组中,则存在他们将竞争caching中的相同时隙的风险。 因此,加载一个会抛出另一个。

因此,与面向对象编程相比,您最终创build的类与您的思维模型中的实体无关。 由于数据是基于数据使用而混合在一起的,因此您不总是会有明智的名称来为您的类提供面向数据的devise。

与关系数据库的关系

面向数据devise背后的思想与您如何看待关系数据库非常相似。 优化关系数据库还可能涉及更高效地使用caching,尽pipe在这种情况下,caching并不是CPUcaching将页面放到内存中。 一个好的数据库devise人员也可能将不经常访问的数据分离到一个单独的表格中,而不是创build一个列数量巨大的表格,只有less数几列被使用过。 他也可能select对一些表格进行非规范化处理,这样就不必从磁盘上的多个位置访问数据。 就像面向数据的devise一样,这些select是通过查看数据访问模式是什么以及性能瓶颈在哪里进行的。

我只想指出,Noel正在专门讨论我们在游戏开发中面临的一些具体需求。 我认为正在进行实时软模拟的其他部门将从中受益,但这不太可能成为一般业务应用程序显着改进的技术。 这个设置是为了确保性能的最后一点被挤出底层硬件。

Mike Acton最近公开谈论了面向数据的devise :

我的基本总结是:如果你想要性能,那么考虑一下数据stream,find最有可能与你一起搞的存储层,并为之优化 迈克关注二级caching未命中,因为他在做实时,但我想象同样的事情适用于数据库(磁盘读取)甚至Web(HTTP请求)。 我认为这是做系统编程的一个有用的方法。

请注意,它并不免除你考虑algorithm和时间复杂性的问题,它只是把注意力集中在找出最昂贵的操作types,然后你必须用你的疯狂的CS技能来达到目标​​。

面向数据的devise是一种devise,其中应用程序的逻辑是由数据集而不是程序algorithm构成的。 例如

程序方法。

 int animation; // this value is the animation index if(animation == 0) PerformMoveForward(); else if(animation == 1) PerformMoveBack(); .... // etc 

数据devise方法

 typedef struct { int Index; void (*Perform)(); }AnimationIndice; // build my animation dictionary AnimationIndice AnimationIndices[] = { { 0,PerformMoveForward } { 1,PerformMoveBack } } // when its time to run, i use my dictionary to find my logic int animation; // this value is the animation index AnimationIndices[animation].Perform(); 

像这样的数据devise促进了数据的使用来构build应用程序的逻辑。 它更容易pipe理,特别是在可能有成千上万的基于animation或其他因素的逻辑path的video游戏中。