Created: 2023-05-28 Sun 22:11
OOD emphasizes encapsulating data within objects, which can lead to poor cache locality and frequent cache misses which cause performance issues.
Simple example of an application performing work on some generic data.
const int ARRAY_SIZE = 100000; struct FOOD { double d1; double d2; double d3; }; int main() { FOOD dataArray[ARRAY_SIZE]; for (int i = 0; i < ARRAY_SIZE; i++) { dataArray[i].d1 = i; dataArray[i].d2 = i; dataArray[i].d3 = i; } for (int i = 0; i < ARRAY_SIZE; i++) { dataArray[i].d1 += sqrt(dataArray[i].d1); dataArray[i].d2 += sqrt(dataArray[i].d2); dataArray[i].d3 += sqrt(dataArray[i].d3); } }
Modified example code
const int ARRAY_SIZE = 100000; struct FDOD { double d1[ARRAY_SIZE]; double d2[ARRAY_SIZE]; double d3[ARRAY_SIZE]; }; int main() { FDOD dataArray; for (int i = 0; i < ARRAY_SIZE; i++) { dataArray.d1[i] = i; dataArray.d2[i] = i; dataArray.d3[i] = i; } for (int i = 0; i < ARRAY_SIZE; i++) { dataArray.d1[i] += sqrt(dataArray.d1[i]); } for (int i = 0; i < ARRAY_SIZE; i++) { dataArray.d2[i] += sqrt(dataArray.d2[i]); } for (int i = 0; i < ARRAY_SIZE; i++) { dataArray.d3[i] += sqrt(dataArray.d3[i]); } }
==OOD== OOD update took avg 1316 microseconds. D1 miss rate: 7.0% ( 6.5% + 7.7% ) ==DOD== DOD update took avg 844 microseconds. D1 miss rate: 4.8% ( 5.1% + 4.1% )
Spec of the different memory acces speeds of 11th gen Intel of cpus:
| Type | Cycles |
|---|---|
| Register | 0.5 |
| L1 | 2-3 |
| L2 | 6-8 |
| L3 | 14-22 |
| DRAM | 90-100 |