In [[computing]], '''data-oriented design''' (not the same as [[data-driven design]]) is a [[program optimization]] approach motivated by [[cache coherency]], used in [[video game]] development (usually in the programming languages [[C (programming language)|C]] or [[C++]]).<ref>{{cite web|title = Data-oriented design|url=http://www.dice.se/wp-content/uploads/2014/12/Introduction_to_Data-Oriented_Design.pdf}}</ref> The approach is to focus on the data layout, separating and sorting [[field (computing)|fields]] according to when they are needed, and to think about transformations of data. Proponents include Mike Acton.<ref>{{cite web|title=CppCon 2014: Mike Acton "Data-Oriented Design and C++"|url=https://www.youtube.com/watch?v=rX0ItVEVjHc}}</ref>
== Motives ==
These methods became especially popular during the [[seventh generation of video game consoles]] whichthat included [[PlayStation 3]] (PS3) and [[Xbox 360]], when the hazards of [[cache misses]] became especially pronounced, due to their use of [[in-order processor]]s with high clock speeds and deep [[Pipeline (computing)|pipelines]] (some of the software issues were similar to those encountered on the [[Itanium]], requiring unrolling for upfront scheduling). In modern systems (even with [[out of order execution]]), [[main memory]] is as many as hundreds of [[clock cycle]]s away from the [[processing element]]s; consequently [[locality of reference]] issues dominate performance, requiring improvement of [[memory access pattern]]s to fix. [[Game console]]s often have relatively weak [[central processing unit]]s (CPUs) to devote more power and transistor budget to the [[graphics processing unit]]s (GPUs). Thus, it is critical that CPU side code is efficient to avoid [[Von Neumann architecture#Von Neumann bottleneck|Von Neumann bottlenecking]].
== Contrast with object-orientation ==
Line 9:
== Other languages ==
The experimental programming language [[Jonathan Blow#JAI language|JAI]] being developed by [[Jonathan Blow]] has explicit support for data-oriented design, while eschewing the traditional OOP paradigm. This is facilitated by being able to transparently move fields between [[Record (computer science)|records]] without extensive source code changes to functions using them (or without extensive [[boilerplate code]] to enable this), and by adding direct support for ''[[AOS and SOA#Structure of arrays|structure of arrays]]'' (SoA) data layout.<ref>{{cite web|title=Data-oriented demo:SOA,composition|url=https://www.youtube.com/watch?v=ZHqFrNyLlpA}}Demonstration of data-oriented and SOA features in the JAI language, also explaining the motives.</ref>