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.
DOD ei ole range protsess nagu "Waterfall", kuid selle rakendamisel läbitakse tavaliselt järgmised mõttelised etapid:
Kuna DOD on pigem filosoofia kui konkreetne reeglistik, on tal mitmeid implementatsioone ja alamvariante:
Kujuta ette mälu kui pikka linti. Allpool on visualiseeritud erinevus OOP ja DOD vahel mälus.
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.
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.
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.
| 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). |
Info põhineb tunnustatud materjalidel andmetele orienteeritud disaini kohta:
Mike Acton: Data-Oriented Design and C++ (CppCon) Unity DOTS (ECS näide)