Du bist nicht angemeldet.

Stilllegung des Forums
Das Forum wurde am 05.06.2023 nach über 20 Jahren stillgelegt (weitere Informationen und ein kleiner Rückblick).
Registrierungen, Anmeldungen und Postings sind nicht mehr möglich. Öffentliche Inhalte sind weiterhin zugänglich.
Das Team von spieleprogrammierer.de bedankt sich bei der Community für die vielen schönen Jahre.
Wenn du eine deutschsprachige Spieleentwickler-Community suchst, schau doch mal im Discord und auf ZFX vorbei!

Werbeanzeige

TrommlBomml

Community-Fossil

Beiträge: 2 117

Wohnort: Berlin

Beruf: Software-Entwickler

  • Private Nachricht senden

11

03.01.2012, 13:08

Mittlerweile ist die Java-VM wohl ziemlich gut. Auch wenn ich kein Fan von Java bin, ist meiner Meinung nach der Faktor 1:20 überhaupt nicht mehr Zeitgemäß :)

Sylence

Community-Fossil

Beiträge: 1 663

Beruf: Softwareentwickler

  • Private Nachricht senden

12

03.01.2012, 13:09

Ich würde sogar so weit gehen zu behaupten, dass die gesamt performance von managed und unmanged mittlerweile im prinzip die gleiche ist...

dot

Supermoderator

Beiträge: 9 757

Wohnort: Graz

  • Private Nachricht senden

13

03.01.2012, 13:54

Anstatt sich zu überlegen wie man das Ganze schneller macht, würd ich mir besser mal überlegen warum das das überhaupt machen sollte. Was genau is denn der Zweck davon?

BlueCobold

Community-Fossil

Beiträge: 10 738

Beruf: Teamleiter Mobile Applikationen & Senior Software Engineer

  • Private Nachricht senden

14

03.01.2012, 14:42

Die Frage hab' ich ja schon gestellt. Antwort kam leider noch keine. Ich denke, dass da ein ganz falscher Ansatz gefahren wird.
Teamleiter von Rickety Racquet (ehemals das "Foren-Projekt") und von Marble Theory

Willkommen auf SPPRO, auch dir wird man zu Unity oder zur Unreal-Engine raten, ganz bestimmt.[/Sarkasmus]

Affje

Treue Seele

  • »Affje« ist der Autor dieses Themas

Beiträge: 89

Beruf: Student

  • Private Nachricht senden

15

03.01.2012, 15:41

Also, warum das Ganze: Das mastermind ist eine Aufgabe für unser Programmierprojekt im aktuellen Semester. Als kleinen Zusatz hat der Professor die Anforderung an das programm gestellt, dass man einen Tipp, bevor man diesen abgibt, auf dessen "Wert" prüfen lassen soll.

Ich habe einerseits eine Überprüfung, ob die Farben schonmal getippt wurden, was mir aber zu wenig ist. Deshalb möchte ich schauen, ob der aktuelle Tipp noch in der Liste möglicher Kombinationen enthalten ist. Nach jedem abgegebenen Tipp streiche ich (mit dem Algorithmus von Shapiro/ "Simple Mastermind Strategy") alle Kombinationen, die mit den vorherigen Tipps niemals die Lösung sein können.

Und da am Anfang eines Spieles ja noch alle Codes in Frage kommen, muss ich zwangsweise(?) alle Kombinationen erstellen lassen.

Und das Ganze dauert doch etwas länger, da das ja "nicht nur" irgendein Vergleich ist, sondern da ja durchaus noch etwas mit reinspielt.

Was weiter oben glaube ich falsch verstanden wurde ist, dass meine Klasse "CompareResult" nicht einfach für einen Vergleich von zwei Objekten im SInne von equals da ist, sondern diese Klasse einen Tipp mit dem Ergebnis vergleicht und die Anzahl schwarzer/weißer Pins ermittelt.

Hier mal die Hauptmethode dieser Klasse:

C-/C++-Quelltext

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
 /**
  * Vergleicht die beiden Farbcodes.
         * Stimmt die Farbe exakt überein, wird eine 1 in die liste eingetragen.
         * Stimmt die Farbe überein, aber hat die falsche Position, wird eine 2 geschrieben.
         * Eine 0 wird geschrieben, falls die Farbe nicht vorkommt.
  */
        private void Compare()
        {
            int blacks = 0;
            int whites = 0;
            
            ArrayList<Integer> guessList = new ArrayList<Integer>();
            ArrayList<Integer> resultList = new ArrayList<Integer>();
            
            //Hinzufuegen der Elemente zu den Listen
            for (int i = 0; i < size; i++)
            {
                guessList.add(guess.Pins()[i].getColor());
                resultList.add(result.getPinAt(i).getColor());
            }
            
            //Schwarze Pins
            for (int i = 0; i < size; i++)
            {
                if (guessList.get(i) == resultList.get(i))
                {
                    blacks++;
                    guessList.set(i, null);
                    resultList.set(i, null);
                    hints.add(1);
                }
            }
            
            //Weisse Pins
            for (int i = 0; i < size; i++)
            {
                if (resultList.get(i) != null)
                for (int j = 0; j < size; j++)
                {
                    if (resultList.get(i) == guessList.get(j))
                    {
                        guessList.set(j, null);
                        whites++;
                        hints.add(2);
                        break;
                    }
                }
            }
            blackPegs = blacks;
            whitePegs = whites;
        }


Natürlich sind da "nur" kleine for-Schleifen drin, aber auch das halt über 262.000 mal....Es werden z.b. 262.000 Listen erstellt mit Speicherplatz suchen etc...Wenn noch mehr Code gebraucht wird, immer sagen.

MfG

Saik0

Treue Seele

Beiträge: 171

Beruf: Anwendungsentwickler

  • Private Nachricht senden

16

03.01.2012, 16:27

In einem vorrigen Post habe ich dir einen Link zu einem Beispiel mit einer LinkedList gezeigt. Ersetz mal die ArrayList durch eine LinkedList und mess dann mal die Zeit wie in dem Beispiel beschrieben

Affje

Treue Seele

  • »Affje« ist der Autor dieses Themas

Beiträge: 89

Beruf: Student

  • Private Nachricht senden

17

03.01.2012, 16:33

In einem vorrigen Post habe ich dir einen Link zu einem Beispiel mit einer LinkedList gezeigt. Ersetz mal die ArrayList durch eine LinkedList und mess dann mal die Zeit wie in dem Beispiel beschrieben

Hab ich doch direkt in dem Posting danach gemacht. Über 90 Sekunden ;)

ArrayList sinds jetzt so an die 900ms auf meinem Hauptrechner, auf meinem Laptop sinkt das auch auf ca. 3 Sekunden, was das Ganze wieder viel zu langsam macht.

Dieser Beitrag wurde bereits 1 mal editiert, zuletzt von »Affje« (03.01.2012, 16:49)


Saik0

Treue Seele

Beiträge: 171

Beruf: Anwendungsentwickler

  • Private Nachricht senden

18

03.01.2012, 16:36

oh hatte deinen Edit überlesen ^^

BlueCobold

Community-Fossil

Beiträge: 10 738

Beruf: Teamleiter Mobile Applikationen & Senior Software Engineer

  • Private Nachricht senden

19

03.01.2012, 17:03

Also die ganzen Schleifen da und die Verwendung der guess und resultList zur Ermittlung der Pins, das ist in der Tat nicht sonderlich performant. Vor allem auch deshalb, weil Du dieses Zeug wohl für jede Kombination auf's Neue machst. Da ist klar, dass Du nicht nur 260.000 Vergleiche machst, sondern 260.000 äußerst ineffiziente Methoden-Aufrufe.
Wozu Du da Listen und keine Arrays verwendest ist mir ebenfalls nicht ganz klar. Du brauchst die Funktionalität von Listen da doch gar nicht.
Teamleiter von Rickety Racquet (ehemals das "Foren-Projekt") und von Marble Theory

Willkommen auf SPPRO, auch dir wird man zu Unity oder zur Unreal-Engine raten, ganz bestimmt.[/Sarkasmus]

Affje

Treue Seele

  • »Affje« ist der Autor dieses Themas

Beiträge: 89

Beruf: Student

  • Private Nachricht senden

20

03.01.2012, 17:10

Also die ganzen Schleifen da und die Verwendung der guess und resultList zur Ermittlung der Pins, das ist in der Tat nicht sonderlich performant. Vor allem auch deshalb, weil Du dieses Zeug wohl für jede Kombination auf's Neue machst. Da ist klar, dass Du nicht nur 260.000 Vergleiche machst, sondern 260.000 äußerst ineffiziente Methoden-Aufrufe.
Wozu Du da Listen und keine Arrays verwendest ist mir ebenfalls nicht ganz klar. Du brauchst die Funktionalität von Listen da doch gar nicht.

Naja, ich brauch das vlt. nicht unbedingt, aber dennoch finde ich es gerade hier deutlich angenehmer mit Listen zu arbeiten. Ich könnte den entsprechenden Index zwar löschen, aber dann muss ich sogar mit jedem weiteren Schritt alle 262.000 Elemente durchgehen und auf null überprüfen, während sich die Liste ja stets verkleinert. Wirklich heikel ist sowieso nur der erste Durchlauf, da ich hier die volle Anzahl an Elementen habe, im zweiten Schritt sind es meist "nur" noch knapp 10-20k, was sich dann im zweistelligen ms Bereich befindet.

Falls es wirklich mit nem Array elegenater wäre, ich lasse mich gerne aufklären, auf den ersten Blick finde ich ne ArrayList hier aber besser.

Werbeanzeige