Frage

Ich las diesem Artikel , und dieser Kerl geht weiter darüber reden, wie jeder kann davon profitieren von Daten in orientiertes~~POS=HEADCOMP Design mit OOP Mischen. Er hat keine Codebeispiele zeigen jedoch.

gegoogelt ich diese und keine wirklichen Informationen finden konnte, was das ist, geschweige denn irgendwelche Codebeispiele. Ist jemand mit diesem Begriff vertraut und kann ein Beispiel nennen? Ist das vielleicht ein anderes Wort für etwas anderes?

War es hilfreich?

Lösung

Zunächst einmal nicht zu verwechseln mit Daten Driven Design.

Mein Verständnis von Datenorientiertes Design ist, dass es um die Organisation Ihre Daten für die effiziente Bearbeitung ist. Vor allem in Bezug auf Cache-Misses etc. Daten Driven Design auf der anderen Seite ist über das Lassen Daten viele Ihrer Programme Verhalten steuern (sehr gut beschrieben von Andrew Keith Antwort ).

Sagen Sie Kugel in einer Applikation mit Eigenschaften wie Farbe, Radius, bounciness, Position usw.

Objektorientierter Ansatz

In OOP würden Sie beschreiben Sie Bälle wie folgt aus:

class Ball {
  Point  position;
  Color  color;
  double radius;

  void draw();
};

Und dann würden Sie eine Sammlung von Kugeln wie folgt erstellen:

vector<Ball> balls;

Datenorientierter Ansatz

In der Datenorientiertes Design jedoch sind Sie eher den Code wie folgt schreiben:

class Balls {
  vector<Point>  position;
  vector<Color>  color;
  vector<double> radius;

  void draw();
};

Wie Sie sehen, gibt es keine einzige Einheit ist mehr eine Kugel darstellt. Ball-Objekte existieren nur implizit.

Dies kann viele Vorteile weisen Leistung hat. Normalerweise wollen wir Operationen auf viele Bälle gleichzeitig tun. Hardware in der Regel will große zusammenhängende Speicherblöcke effizient zu betreiben.

Zweitens könnten Sie Operationen durchführen, die nur einen Teil eines Kugeln Eigenschaften auswirkt. Z.B. wenn Sie die Farben aller Kugeln auf verschiedene Weise kombinieren, dann möchten Sie Ihren Cache nur Farbinformationen enthalten. Wenn jedoch alle Kugeln Eigenschaften in einem Gerät gespeichert sind, werden Sie auch in allen anderen Eigenschaften einer Kugel ziehen. Auch wenn Sie sie nicht brauchen.

Cache Verwendung Beispiel

Say einen Ball jede Kugel 64 Byte aufgreift und ein Punkt dauert 4 Byte. Ein Cache-Schlitz nimmt auch 64 Bytes sagen. Wenn ich die Position von 10 Kugeln zu aktualisierenden muss ich in 10 * 64 = 640 Byte Speicher in den Cache ziehen und 10 Cache-Misses zu erhalten. Wenn jedoch kann ich die Positionen der Kugeln als separate Einheiten arbeiten, das dauert nur 4 * 10 = 40 Byte. Das paßt in einem Cache holen. So erhalten wir nur 1 Cache-Miss alle 10 Bälle zu aktualisieren. Diese Zahlen sind willkürlich Ich gehe davon aus einem Cache-Block ist größer.

Aber es zeigt, wie Speicherlayout schwere Effekt Cache-Hits und damit die Leistung haben kann. Dies wird nur dann an Bedeutung zunehmen als die Differenz zwischen CPU und RAM-Geschwindigkeit erweitert.

Wie die Erinnerung Layout

In meinem Ball Beispiel vereinfacht ich das Problem viel, weil in der Regel für jede normale Anwendung, die Sie wahrscheinlich zusammen mehrere Variablen zugreifen. Z.B. Position und der Radius wird wahrscheinlich häufig zusammen verwendet werden. Dann sollten Sie Ihre Struktur sein:

class Body {
  Point  position;
  double radius;
};

class Balls {
  vector<Body>  bodies;
  vector<Color>  color;

  void draw();
};

Der Grund, warum Sie dies tun sollen, ist, dass, wenn zusammen verwendet, um Daten in getrennten Arrays angeordnet sind, besteht die Gefahr, dass sie für die gleiche Schlitze im Cache konkurrieren. So ein Laden wird die andere werfen.

verglichen So Orientiert Objekt, um die Klassen Programmierung Sie machen am Ende nicht in Ihrem mentalen Modell des Problems für die Einheiten zusammen. Da die Daten zusammen auf Datennutzung basieren in einen Topf geworfen wird, werden Sie nicht immer sinnvoll, Namen haben Ihre Klassen in Datenorientiertes Design zu geben.

Relation zu relationalen Datenbanken

Der Gedanke hinter Datenorientiertes Design ist sehr ähnlich, wie Sie über relationale Datenbanken denken. eine relationale Datenbank Optimierung kann auch der Cache effizienten einbeziehen verwenden, obwohl in diesem Fall die Cache nicht CPU-Cache-Put-Seiten im Speicher ist. Ein guter Datenbank-Designer wird wahrscheinlich auch eher selten genutzte Daten in eine separate Tabelle aufzuzuschlüsseln als eine Tabelle mit riesiger Anzahl von Spalten zu schaffen nur einige der Säulen waren, werden immer verwendet. Er könnte auch wählen, einige der Tabellen denormalize, so dass Daten müssen nicht von mehreren Standorten auf der Festplatte zugegriffen werden. Genau wie mit Datenorientiertes Design werden diese Entscheidungen getroffendurch einen Blick auf, was die Datenzugriffsmuster sind und in dem die Performance-Engpass ist.

Andere Tipps

Mike Acton gab einen öffentlichen Vortrag über Daten Design orientiert kürzlich:

Meine grundlegende Zusammenfassung davon wäre: wenn Sie die Leistung wollen, dann über den Datenfluss denken, an die Speicherschicht finden, die am ehesten mit Ihnen schrauben und es hart optimieren Mike konzentriert. auf L2-Cache-Misses, weil er in Echtzeit ist zu tun, aber ich glaube, gilt das gleiche zu Datenbanken (Disk liest) und auch im Web (HTTP-Anfragen). Es ist eine nützliche Methode, Systeme Programmierung zu tun, denke ich.

Beachten Sie, dass es nicht Sie entbindet von Gedanken über Algorithmen und Zeitkomplexität, es konzentriert sich nur Ihre Aufmerksamkeit auf die teuerste Operationstyp herauszufinden, die Sie dann mit Ihrem verrückt CS Fähigkeiten zielen muss.

Ich möchte nur darauf hinweisen, dass Noel speziell über einige der spezifischen Bedürfnisse spricht man in der Spielentwicklung gegenüber. Ich nehme an andere Sektoren, die Echtzeit-Simulation weichen tun würde davon profitieren, aber es ist unwahrscheinlich, eine Technik sein, die spürbare Verbesserung der allgemeinen Geschäftsanwendungen zeigen. Diese Einrichtung ist für die Sicherstellung, dass jedes letzte bisschen Leistung aus der zugrunde liegenden Hardware gequetscht.

Ein Datenorientiertes Design ist ein Design, in dem die Logik der Anwendung aus Datensätzen aufgebaut ist, anstelle von Verfahrensalgorithmen. Zum Beispiel

prozeduralen Ansatz.

int animation; // this value is the animation index

if(animation == 0)
   PerformMoveForward();
else if(animation == 1)
  PerformMoveBack();
.... // etc

Daten Design-Ansatz

typedef struct
{
   int Index;
   void (*Perform)();
}AnimationIndice;

// build my animation dictionary
AnimationIndice AnimationIndices[] = 
  {
      { 0,PerformMoveForward }
      { 1,PerformMoveBack }
  }

// when its time to run, i use my dictionary to find my logic
int animation; // this value is the animation index
AnimationIndices[animation].Perform();

Daten Entwürfe so die Nutzung von Daten fördern, um die Logik der Anwendung zu erstellen. Sein leichter zu verwalten vor allem in Videospielen, die Tausende von Logikpfaden basierend auf Animation oder einen anderen Faktor haben könnte.

Lizenziert unter: CC-BY-SA mit Zuschreibung
Nicht verbunden mit StackOverflow
scroll top