Schneller Index-Typ
-
Hallo!
Ich brauche als Index für Arrays einen Integer mit einem Wertebereich von 0
bis 3, so daß nach 3 wieder 0 kommt. Die Anforderungen sind:a) Addition von 1 und 2. Das sollte komfortabel gehen, da der Typ im
gesamten Programm verwendet wird, z.B. i=i+2.
b) Maximale Performance wegen häufiger Verwendung in einem zeitkritischen
Programmteil.Die momentane Lösung verwendet einen Integer und die beiden Funktionen
increaseBy1(int i) und increaseBy2(int i), die jeweils ein Array besitzen,
in dem der zurückzuliefernde Wert an der Stelle i steht. Das ist schon mal
spürbar schneller als Addition und Modulo-Operation. Allerdings ist das
nicht sehr komfortabel. Ich nehme an, daß die Performance leidet, wenn ich
das in eine Klasse packe. Andere Ideen?lg
-
Wieso sollte eine Klasse das verlangsamen? Denke aber, dass das mit den Arrays schon sehr schnell ist. Modulo brauchst du ja nicht, so etwas geht doch auch:
int inc (int i) { if(i > 2) return 0; return i+1; } int inc2 (int i) { if(i > 2) return 1; if(i > 1) return 0; return i+2; // alternativ: i += 2; if(i > 3) return i-4; return i; }MfG SideWinder
-
a) Addition von 1 und 2. Das sollte komfortabel gehen, da der Typ im
gesamten Programm verwendet wird, z.B. i=i+2.
b) Maximale Performance wegen häufiger Verwendung in einem zeitkritischen
Programmteil.Dann nimm einfach unsigned int.
Wenn +1 und +2 öfter vorkommen, nimm
x+=1 bzw x+=2
nebst
if(x%4==y%4) bzw if(x%4==3) bzw print(x%4) und vor allem z=array[x%4]
(Annhame, daß der Rechner normal ist und unsigned int bei einer Zweierpotenz sich überschlägt und bei 0 weiterzählt)anderenfalls nimm
x=(x+1)%4 bzw x=(x+2)%4
nebst
if(x==y) bzw if(x==3) bzw print(x) und z=array[x]Natürlich kannst Du in C++ diese Funktionalität auch zu Null Laufzeitkosten in eine Klasse stopfigen. Ich glaube aber, das würde ich lassen.
-
Wieso Modulo? Wieso if? Wieso nicht Bitweise Und?
i = (i + 1) & 3;Schneller geht's vermutlich nicht.
-
hustbaer schrieb:
Wieso nicht Bitweise Und?
Weil %4 und &3 zum gleichen Code führen, und ich %4 hier für angemessener halte, dem Problem mehr entsprechend.
-
cout2 schrieb:
Die momentane Lösung verwendet einen Integer und die beiden Funktionen
increaseBy1(int i) und increaseBy2(int i), die jeweils ein Array besitzen,
in dem der zurückzuliefernde Wert an der Stelle i steht. Das ist schon mal
spürbar schneller als Addition und Modulo-Operation.Echt? Zeig mal dein Programm zum Zeitmessen.