Laden...

Alpha-Beta Algorithmus: Wie groß ist der Overhead durch Objektorientierung?

Erstellt von bloody_fighter vor 13 Jahren Letzter Beitrag vor 13 Jahren 2.238 Views
B
bloody_fighter Themenstarter:in
54 Beiträge seit 2008
vor 13 Jahren
Alpha-Beta Algorithmus: Wie groß ist der Overhead durch Objektorientierung?

Guten Tag,

macht es denn einen Unterschied, wenn ich einen Algorithmus mit Objekten löse oder alles ohne eigene Objekte realisiere?
also angenommen mein Objekt hat die Attribute int a, String b und die funktion meineMethode().
Ist es jetzt schneller, wenn ich, anstatt das Objekt zu erzeugen, nur int a, String b und meineMethode(a,b) habe? Oder "erkennt" der Compiler das und macht da keinen unterschied?

Gelöschter Account
vor 13 Jahren

ja mit oop hast du dann ein paar indirektionen mehr, aber das fällt wohl kaum ins gewicht. der rest liegt an deinem design.

L
862 Beiträge seit 2006
vor 13 Jahren

Ich hatte mal den Fall dass meine Anwendung immer so ~0,5sec-Hänger gehabt hat. Ursache war die Aufräumroutine des GarbageCollectors der bei über 100.000 Objekten schon mal 500ms brauchen kann.

In 99,9% aller Fälle fällt soetwas aber nicht ins Gewicht.

5.742 Beiträge seit 2007
vor 13 Jahren

macht es denn einen Unterschied, wenn ich einen Algorithmus mit Objekten löse oder alles ohne eigene Objekte realisiere?

Auch hier: "Premature optimization is the root of all evil".
Ich habe es schon ein paar mal erlebt, dass angebliche "Optimierungen" (die auf irgendwelchen Annahmen oder Ideen basierten) den Code langsamer gemacht haben, als er ursprünglich gewesen wäre. Und unübersichtlich war er dazu auch noch.

Also: Immer es nachmessen, danach optimieren.

B
bloody_fighter Themenstarter:in
54 Beiträge seit 2008
vor 13 Jahren

Es geht darum, dass ich den Alpha-Beta Algorithmus für das Kartenspiel Skat implementieren möchte, da kämen dann auch sehr sehr viele Objekte zustande...deshalb habe ich mir die Frage gestellt, ob ich meiner rekursiven Funktion immer ein Objekt übergeben soll (bzw. 2, 3, je nachdem) oder ob ich alles als extra Parameter übergeben soll....die Objekte werden auch teilweise kopiert, das macht dann vielleicht auch noch einen Einfluss für die Entscheidung?

5.742 Beiträge seit 2007
vor 13 Jahren

Es geht darum, dass ich den Alpha-Beta Algorithmus für das Kartenspiel Skat implementieren möchte, da kämen dann auch sehr sehr viele Objekte zustande

Und du glaubst, dass dein Algorithmus an sich bereits so hochoptimiert, parallelisiert etc. ist, dass du auf die 1-2ms (wenn überhaupt), die das vielleicht als Unterschied macht, angewiesen bist?
Ich nicht. 😉

Daher mein Rat: Finger weg von solchen "Scheinoptimierungen" - viel mehr Performance kannst du rausholen, indem du profilst und gezielt optimierst.

Gelöschter Account
vor 13 Jahren

Allgemein kann man zudem noch sagen, das hochrekursive Algorithmen unter F# meistens deutlich schneller ausgeführt werden. Ob das auch in diesem Fall ist, kann ich allerdings nicht sagen.

C
2.122 Beiträge seit 2010
vor 13 Jahren

Grundsätzlich würd ich sagen, unnötig Objekte anlegen nur damit man oo programmiert ist Unsinn. Wobei man in C# ja sowieso immer in einem Objekt ist.
Objekte sparen wo sie hilfreich und übersichtlich sein könnten, ist auch Unsinn.

Wenns nur um die Übergabe von 3 Parametern geht würd ich kein Objekt machen. Da schreibst du ja schon viel länger dran rum bis das erzeugt und befüllt und dann wieder ausgewertet ist.

B
bloody_fighter Themenstarter:in
54 Beiträge seit 2008
vor 13 Jahren

@WinSharp, nein, denke ich nicht, aber ich dachte mir halt, dass es sicher nicht schaden kann, das von anfang an "optimierter" zu machen...z.B. übergebe ich jedes mal 3 Listen (/Arrays) aus Karten....Karten wäre hierbei dann ja ein Objekt, die Listen auch ein Objekt...alternativ könnte ich dann ja auch feste Arrays übergeben mit den jeweiligen eigenschafen der karte....wobei das erste deutlich übersichtlicher ist.
@JAck30lena, wieso ist es in F# deutlich schneller?

5.742 Beiträge seit 2007
vor 13 Jahren

wobei das erste deutlich übersichtlicher ist.

Genau darauf möchte ich hinaus: Was hilft es dir, wenn du selbst nicht mehr verstehst, was dein Code macht, er dafür aber vielleicht um 1,5% schneller ist?

Die 1,5% merkt man überhaupt nicht (erst ab ca. 30-50% Geschwindigkeitszuwachs nimmt man das auch subjektiv wahr), während der Preis dafür hoch ist.
Daher entscheide dich lieber für die Übersichtlichere Variante als für die evtl. Performante - optimieren kannst du später noch nach Belieben.

49.485 Beiträge seit 2005
vor 13 Jahren

Hallo zusammen,

bei einem Alpha-Beta-Algorithmus, von dem ja bezogen auf Skat von vornherein bekannt ist, dass er Laufzeit und Speicherplatz kritisch ist, ist es durch aus sinnvoll und keinesfalls "premature", sich über eine kompakte und schnelle Repräsentation der Spielstände Gedanken zu machen.

Hallo bloody_fighter,

die Gegenreaktion, die du hier erfahren hast, erkläre ich mir damit, dass deine Eingangsfrage schon, sorry, ein bisschen naiv und blauäugig klingt und du die entscheidende Information mit dem Alpha-Beta-Algorithmus unterschlagen hast. Zur Klarstellung habe ich diesen wichtigen Umstand mal in den Titel aufgenommen.

Letztlich ist es aber keine Frage von Objektorientierung oder nicht, sondern eben von einer kompakten und schnellen Repräsentation, die durchaus objektorientiert sein kann. Wie eine solche aussehen kann, hängt aber von den konkreten Umständen ab und lässt sich nicht allgemein beantworten. Da es um 32 Spielkarten geht, könnte es durchaus sinnvoll sein, ein Blatt als Bitfolge in einem (U)Int32 zu repräsentieren.

herbivore