Datenorientiertes Design

aus Wikipedia, der freien Enzyklopädie

Datenorientiertes Design (DOD) ist ein Ansatz zur Optimierung von Computerprogrammen, der die effiziente Nutzung des CPU-Caches anstrebt und beispielsweise bei der Entwicklung von Computerspielen[1][2] und Webbrowsern[3] Verwendung findet. Die Methode des datenorientierten Designs beinhaltet, das Speicherlayout aller Strukturen im Programm so zu planen, dass Daten, welche von einer Prozedur gebraucht werden, möglichst nahe beieinander im Speicher liegen (Speicherlokalität).

Verfechter dieses Paradigmas sind unter anderem Stoyan Nikolov[3], Mike Acton[4] und Scott Meyers[5].

Motivation

DOD wurde Mitte bis Ende der 2010er Jahre, während der 7. Generation von Spielkonsolen, Xbox 360, PlayStation 3 und Wii, populär. Historisch gesehen haben Spielkonsolen oft relativ schwache CPUs, wenn sie mit den zeitgenössischen Desktop-Computern verglichen werden, dafür jedoch stärkere Grafikprozessoren (GPUs). Um trotzdem möglichst viel aus den CPUs herauszuholen muss der sogenannte Von-Neumann'sche Flaschenhals umgangen werden. Mit dem Von Neumann'sche Flaschenhals ist die Problematik gemeint, dass moderne CPUs wesentlich schneller Daten verarbeiten als die vergleichsweise langsamen Hauptspeicher laden können. Dieses Problem versucht man unter anderem mit Technologien wie schnellen Cache-Speichern, die direkt in die CPU integriert sind, zu lösen. Allerdings kommt es häufig vor, dass Daten, die die CPU anfordert, nicht im Cache geladen sind und somit eine Anfrage an den Hauptspeicher erfolgen muss. Dies wird als cache-miss bezeichnet. Um diese zu minimieren, sollten Daten, die von der CPU gleichzeitig oder zeitlich nahe beieinander verwendet werden, im Speicher nahe bei einander liegen (Speicherlokalität), um so Speicherzugriffsmuster zu verbessern und den Effekt des Flaschenhalses zu minimieren.

Gegensatz zur Objektorientierung

Die Prinzipien der objektorientierten Programmierung können in schlechter Datenlokalität münden. Insbesondere kann die Nutzung von Polymorphismus dazu beitragen. In der Programmiersprache C++ ist dieses Konzept bspw. mittels vTables implementiert, was dazu führt, dass zur Ausführung einer virtuellen Methode ein Pointer aufgelöst werden muss[6].

Wenn virtuelle Methoden vieler einzelner Objekte aufgerufen werden müssen, kann dies durchaus die Laufzeit beeinträchtigen. In DOD wird es hingegen vermieden virtuelle Methoden zu nutzen. Stattdessen werden die Daten der Objekte in Verbunddatentypen organisiert und eine externe Funktion/Methode wird genutzt, um die gewünschte Operation auf alle Objekte, welche sich optimalerweise innerhalb eines Arrays befinden, hintereinander weg anzuwenden, womit das mehrfache Auflösen von Pointern umgangen werden soll.[7] Kurzgefasst wird versucht, Daten, die häufig gemeinsamen gebraucht werden, so auf Verbunddatentypen und Arrays zu verteilen, dass sie im Speicher nahe beieinander liegen (Speicherlokalität), um effizienteren Zugriff zu ermöglichen.

Siehe auch

Literatur

  • Noel Llopis: High‐Performance Programming with Data‐Oriented Design in: Eric Lengyel: Game Engine Gems 2, CRC Press, 2011, S. 251 ff. [3]

Weblinks

Einzelnachweise

  1. Data-Oriented Design (Or Why You Might Be Shooting Yourself in The Foot With OOP). Noel Llopis. 4. Dezember 2009.
  2. Robert Nystrom: Design Patterns für die Spieleprogrammierung, MITP-Verlag, 2015, S. 526 [1]
  3. a b CppCon 2018: Stoyan Nikolov “OOP Is Dead, Long Live Data-oriented Design”. CppCon.
  4. CppCon 2014: Mike Acton "Data-Oriented Design and C++". CppCon.
  5. code::dive conference 2014 - Scott Meyers: Cpu Caches and Why You Care. NOKIA Technology Center Wrocław.
  6. Richard Fabian: What's wrong with OOP? In: http://www.dataorienteddesign.com. Data Orientated Design, 25. Juni 2013, abgerufen am 8. Juli 2020 (englisch).
  7. Norman F. Schneidewind: Computer, Network, Software, and Hardware Engineering with Applications, John Wiley & Sons, 2012, S. 266 [2]