Pertama-tama, jangan bingung dengan desain berbasis data.
Pemahaman saya tentang Desain Berorientasi Data adalah tentang mengatur data Anda untuk pemrosesan yang efisien. Khususnya sehubungan dengan kesalahan cache dll. Disain Data Driven Desain di sisi lain adalah tentang membiarkan data mengontrol banyak perilaku program Anda (dijelaskan dengan sangat baik oleh jawaban Andrew Keith ).
Katakanlah Anda memiliki objek bola dalam aplikasi Anda dengan properti seperti warna, jari-jari, goyang, posisi dll.
Pendekatan Berorientasi Objek
Di OOP Anda akan menggambarkan bola seperti ini:
class Ball {
Point position;
Color color;
double radius;
void draw();
};
Dan kemudian Anda akan membuat koleksi bola seperti ini:
vector<Ball> balls;
Pendekatan Berorientasi Data
Dalam Desain Berorientasi Data, Anda cenderung menulis kode seperti ini:
class Balls {
vector<Point> position;
vector<Color> color;
vector<double> radius;
void draw();
};
Seperti yang Anda lihat tidak ada lagi satu unit yang mewakili satu Bola lagi. Objek bola hanya ada secara implisit.
Ini dapat memiliki banyak keuntungan, kinerja bijaksana. Biasanya kami ingin melakukan operasi pada banyak bola secara bersamaan. Perangkat keras biasanya ingin potongan memori besar terus menerus beroperasi secara efisien.
Kedua, Anda mungkin melakukan operasi yang hanya memengaruhi sebagian dari properti bola. Misalnya, jika Anda menggabungkan warna semua bola dengan berbagai cara, maka Anda ingin cache Anda hanya berisi informasi warna. Namun ketika semua properti bola disimpan dalam satu unit Anda akan menarik semua properti bola lainnya juga. Meskipun Anda tidak membutuhkannya.
Contoh Penggunaan Cache
Katakanlah setiap bola membutuhkan 64 byte dan sebuah Point membutuhkan 4 byte. Slot cache mengambil, katakanlah, 64 byte juga. Jika saya ingin memperbarui posisi 10 bola, saya harus menarik 10 * 64 = 640 byte memori ke dalam cache dan mendapatkan 10 cache misses. Namun jika saya dapat menggunakan posisi bola sebagai unit terpisah, itu hanya akan memakan waktu 4 * 10 = 40 byte. Itu cocok untuk satu cache cache. Jadi kita hanya mendapatkan 1 cache miss untuk memperbarui semua 10 bola. Angka-angka ini sewenang-wenang - Saya menganggap blok cache lebih besar.
Tapi itu menggambarkan bagaimana tata letak memori dapat memiliki efek parah pada hit cache dan dengan demikian kinerja. Ini hanya akan semakin penting karena perbedaan antara kecepatan CPU dan RAM melebar.
Cara tata letak memori
Dalam contoh bola saya, saya banyak menyederhanakan masalah, karena biasanya untuk aplikasi normal apa pun Anda mungkin akan mengakses beberapa variabel secara bersamaan. Misalnya posisi dan jari-jari mungkin akan sering digunakan bersama. Maka struktur Anda harus:
class Body {
Point position;
double radius;
};
class Balls {
vector<Body> bodies;
vector<Color> color;
void draw();
};
Alasan Anda harus melakukan ini adalah bahwa jika data yang digunakan bersama ditempatkan dalam array yang terpisah, ada risiko bahwa mereka akan bersaing untuk slot yang sama di cache. Jadi memuat satu akan membuang yang lain.
Jadi dibandingkan dengan pemrograman Berorientasi Objek, kelas yang Anda buat akhirnya tidak terkait dengan entitas dalam model mental masalah Anda. Karena data disatukan berdasarkan penggunaan data, Anda tidak akan selalu memiliki nama yang masuk akal untuk memberikan kelas Anda dalam Desain Berorientasi Data.
Hubungan dengan database relasional
Pemikiran di balik Desain Berorientasi Data sangat mirip dengan bagaimana Anda berpikir tentang database relasional. Mengoptimalkan basis data relasional juga dapat melibatkan penggunaan cache lebih efisien, meskipun dalam hal ini, cache bukan cache CPU tetapi halaman dalam memori. Perancang basis data yang baik juga kemungkinan akan membagi data yang jarang diakses ke dalam tabel terpisah daripada membuat tabel dengan jumlah kolom yang sangat banyak hanya beberapa kolom yang pernah digunakan. Dia mungkin juga memilih untuk mendenormalkan beberapa tabel sehingga data tidak harus diakses dari beberapa lokasi pada disk. Sama seperti dengan Desain Berorientasi Data, pilihan ini dibuat dengan melihat apa pola akses data dan di mana hambatan kinerja.