Update von 2.2 Froyo auf 2.3.3 Gingerbread - Eigene App nun sehr viel langsamer

  • Hallo alle zusammen,


    Ich habe folgendes Problem. Habe mein SGS von 2.2 auf 2.3.3 geupdated. An sich läuft das auch echt gut. Nur mein Programm ist an einer Stelle im Code erheblich langsamer geworden und ich würde gerne wissen warum?
    Zunächst zu meinem Programm. Es ist ein Rubiks Cube Solver der mit Hilfe der integr. Kamera den Würfel einliest und die Farben automatisch erkennt und dem entsprechend eine Lösung berechnet. Die Berechnung einer Lösung basiert auf dem Two-Phase Algorithmus (siehe dazu http://kociemba.org/cube.htm ). Hierbei werden zu Anfang bestimmte Move- und Pruning tables generiert und genau da liegt das Problem. Da sind zwar grob gesagt sehr rechenaufwendige Operationen und Loops drin aber das war bei der Version 2.2 ja nicht anders. Und am meisten macht den 2.3.3 zu schaffen getter und setter Methoden welche in den Loops sehr häufig aufgerufen werden.


    Um es anhand von Code vll etwas deutlich zu machen hier ein kleiner Ausschnitt:






    Dies ist der Ausschnitt und genau da ist mein 2.3.3 fast 10 mal langsamer als 2.2. Weiß vielleicht jemand warum das so ist? Und wie ich das beheben kann?
    Ich finde es nämlich recht komisch, da Gingerbread ja hochgelobt wird vonwegen es sei noch schneller und neuer optimierter GarbageCollector und so weiter...


    Vielen Dank und lg joensen

  • Hi Joensen,


    also auf den ersten Blick fällt mir auf, das du diese Rechnung

    Zitat


    N_SLICE1 * N_FLIP


    immer wieder neu ausführst.
    Es wäre besser, wenn du es nur einmal berechnest und das Ergebnis in einer Variable speicherst.
    Damit würden schonmal die Schleifen besser laufen.


    Was mir nicht ganz klar ist wozu ist dies Schleife:


    Zitat


    for (int i = 0; i < N_SLICE1 * N_FLIP / 2; i++)
    Slice_Flip_Prun[i] = -1;


    also was sie macht versteh ich schon, nur wozu?


    mfg Titus


    p.s. das App hört sich echt toll an gibt es das schon irgendwo?
    Wirde es mir gerne mal in Aktion ansehen.

  • Danke Titus für deine Antwort.


    Mit der ständig neuen Berechnung von

    Code
    N_SLICE1 * N_FLIP


    hab ich auch schon dran gedacht und geändert:


    Code
    final int w1=N_SLICE1 * N_FLIP / 2;
     final int w2=N_SLICE1 * N_FLIP;


    Diese nutze ich dann in den loops... hat aber nicht wirklich was gebracht leider.
    Zudem habe ich die ständigen Aufrufe von getPruning und setPruning nun vermieden indem ich sie per Hand quasi "inline" programmiert habe (war das ne arbeit... :( ).
    Das hat auch schon etwas gebracht. Ohne Optimierung dauerte die Generierung der Tabellen 560 sekunden (nur beim ersten mal). Mittlerweile bin ich durch die oben genannten
    Optimierungen bei 418 sekunden. Als noch Android 2.2 auf meinem SGS rannte dauerte es allerding nur zwischen 60-90 sekunden und das ohne die genannten Optimierungen...


    Und bezüglich deiner Frage was die Schleife machen soll: Sie soll ledeglich die einzelnen Array-Elemente mit -1 initialisieren mehr nicht.


    Solche Apps gibt es in unterschiedlichen Formen. Ich habe dies als Bachelorarbeit gemacht in Verbindung mit einem Lego-Mindstorms Aufbau. Mein SGS liest mit der Kamera den Würfel ein und berechnet die Lösung und steht dabei ständig via Bluetooth in Verbindung mit dem Lego-Mindstorms-Roboter, welcher die Züge letztendlich dann ausführt.
    Die App kann aber auch im stand-alone Betrieb benutzt werden. Beim Start wird halt geschaut ob eine Bluetooth Verbindung zu den Targets hergestellt werden kann, und wenn das nicht der Fall is kann man trotzdem den Würfel scannen und dann halt per hand die Lösung am Würfel anwenden.


    hier mal ein Plakat was ich damals für das Kolloq angefertigt habe.


    [Blockierte Grafik: http://img204.imageshack.us/img204/3171/kolloqposterverlustfrei.jpg]


    Uploaded with ImageShack.us




    lg joensen

Jetzt mitmachen!

Sie haben noch kein Benutzerkonto auf unserer Seite? Registrieren Sie sich kostenlos und nehmen Sie an unserer Community teil!