Data-Oriented Design (DOD)

Data-Oriented Design (andmetele orienteeritud disain) on tarkvaraarenduse paradigma, mis keskendub andmete paigutusele arvuti mälus, andmete lugemise mustritele ja riistvara (eriti CPU vahemälu) tõhusale kasutamisele. Erinevalt objektorienteeritud programmeerimisest (OOP), mis modelleerib maailma "asjade" ja nende suhetena, modelleerib DOD maailma andmevoogudena.

Mis etapid seal on?

DOD ei ole range protsess nagu "Waterfall", kuid selle rakendamisel läbitakse tavaliselt järgmised mõttelised etapid:

Alamvariandid ja seotud mustrid

Kuna DOD on pigem filosoofia kui konkreetne reeglistik, on tal mitmeid implementatsioone ja alamvariante:

Arendusmudel joonisena (Visualiseering)

Kujuta ette mälu kui pikka linti. Allpool on visualiseeritud erinevus OOP ja DOD vahel mälus.

OOP (Array of Structures - AoS)

Andmed on killustatud. Kui süsteem vajab ainult "Oranži" infot, peab CPU laadima mälust ka "Musta" ja "Halli" info, mis raiskab vahemälu ruumi.

A1B1C1 A2B2C2 A3B3C3

DOD (Structure of Arrays - SoA)

Andmed on pakitud tüübi järgi. Kui süsteem vajab "Oranži" infot, saab CPU lugeda järjest ainult oranže plokke. See on ülikiire.

A1A2A3 B1B2B3 C1C2C3

Tähtsaim omadus ja miks

Cache Locality (Vahemälu lokaalsus)

See on DOD kõige kriitilisem omadus. Miks? Tänapäeva protsessorid on sadu kordi kiiremad kui põhimälu (RAM). CPU veedab enamuse ajast oodates andmeid mälust ("Von Neumann bottleneck").

DOD paigutab andmed nii, et kui CPU loeb ühe tüki, laetakse vahemällu (Cache Line) automaatselt ka järgmised vajalikud tükid. See vähendab drastiliselt cache miss-ide arvu ja tõstab jõudlust kordades.


DOD Plussid ja Miinused

Head (Pros) Vead (Cons)
Jõudlus: Maksimaalne riistvara ärakasutamine ja kiirem töötlus. Õppimiskurv: Raske mõista arendajatel, kes on harjunud OOP-ga.
Skaleeritavus: Lihtne töödelda tuhandeid või miljoneid objekte korraga. Jäikus: Andmestruktuuride muutmine võib nõuda suuremat ümberkirjutamist.
Paralleelsus: Kuna andmed on eraldatud ja sõltuvused minimaalsed, on koodi lihtne jagada mitme tuuma vahel (multithreading). Koodi maht: Võib nõuda rohkem "boilerplate" koodi lihtsate asjade tegemiseks.
Testitavus: Süsteemid on sageli "puhtad funktsioonid" (sisend -> väljund), mida on kerge testida. Intuitiivsus: Ei vasta alati sellele, kuidas inimesed maailma tajuvad (objektidena).

Viited ja lisalugemine

Info põhineb tunnustatud materjalidel andmetele orienteeritud disaini kohta:

Mike Acton: Data-Oriented Design and C++ (CppCon) Unity DOTS (ECS näide)