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:
// ++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
// Pruning table for the flip of the edges and the position (not permutation) of the UD-slice edges in phase1
// The pruning table entries give a lower estimation for the number of moves to reach the H-subgroup.
static byte[] Slice_Flip_Prun = new byte[N_SLICE1 * N_FLIP / 2];
static {
for (int i = 0; i < N_SLICE1 * N_FLIP / 2; i++)
Slice_Flip_Prun[i] = -1;
int depth = 0;
setPruning(Slice_Flip_Prun, 0, (byte) 0);
int done = 1;
int newSlice=0;
int newFlip=0;
while (done != N_SLICE1 * N_FLIP) {
for (int i = 0; i < N_SLICE1 * N_FLIP; i++) {
int flip = i / N_SLICE1, slice = i % N_SLICE1;
if (getPruning(Slice_Flip_Prun, i) == depth) {
for (int j = 0; j < 18; j++) {
newSlice = FRtoBR_Move[slice * 24][j] / 24;
newFlip = flipMove[flip][j];
if (getPruning(Slice_Flip_Prun, N_SLICE1 * newFlip + newSlice) == 0x0f) {
setPruning(Slice_Flip_Prun, N_SLICE1 * newFlip + newSlice, (byte) (depth + 1));
done++;
}
}
}
}
depth++;
}
Log.d("CoordCube","(#4) Slice_Flip_Prun");
// ++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
// Set pruning value in table. Two values are stored in one byte.
static void setPruning(byte[] table, int index, byte value) {
if ((index & 1) == 0)
table[index / 2] &= 0xf0 | value;
else
table[index / 2] &= 0x0f | (value << 4);
}
// ++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
// Extract pruning value
static byte getPruning(byte[] table, int index) {
if ((index & 1) == 0)
return (byte) (table[index / 2] & 0x0f);
else
return (byte) ((table[index / 2] & 0xf0) >>> 4);
}
Alles anzeigen
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