Forum

Einloggen | Registrieren | RSS  

Zahnlos72(R)

07.03.2023,
19:35
 

for-Schleife Timing ..... (Elektronik)

Hallo schon wieder !

Hätte da wieder ein Timing-Ansinnen .....
Die Schleife macht zwar was sie soll, aber es wäre mir lieber, wenn es dafür einen schnelleren Code gäbe....

Er wandelt übrigens den Wert von COLOR in die einzelnen 8 Bits um und die dabei in der for-Schleife ausgegebenen 0en und 1en werden dann ausgewertet.


weiss da jemand was Schnelleres ???


for (int g=7;g>=0;g--) {
if(bitRead(COLOR[0][0], g)==0) {
Mach es ....
Mach es .... }
else
{
Mach was anderes...
Mach was anderes... }
}


lG

bastelix(R)

07.03.2023,
22:19

@ Zahnlos72

for-Schleife Timing .....

Klar, da kann man noch einiges machen:

» for (int g=7;g>=0;g--) {
» if(bitRead(COLOR[0][0], g)==0) {
for (uint8_t g = 7; g >= 0; --g) {
if ((COLOR[0][0] & ( 1 << g )) >> g) { /* ... */ } else { /* ... */ }
}

1. --g statt g-- spart Arbeitsspeicher und (wenn ich mich richtig erinnere) drei CPU Zyklen.
2. Shift-Operator verwenden statt Methoden Aufruf spart einen Methodenaufruf... Außer wenn der Compiler die readBit-Aurufe eh inline macht, dann gewinnst lediglich schwerer lesbaren Code.

So und wenn du wirklich schneller werden willst, dann schmeiß die Schleife weg und mach aus dem if je Bit einfach ein switch(CORLOR[0][0]) und für jede mögliche Konstellation die in der Variablen drin stehen kann einen case-Statement (die kann man auch zusammenfassen wenn für verschiedene Bitmuster das gleiche gemacht werden soll).

Das mit dem prefix-Operator kannst du dir angewöhnen, das schadet nicht. Den postfix-Operator wirst du dann nur noch verwenden wenn du ihn wirklich brauchst ;-)
Shift-Operatoren statt einer (inline) Methode würde ich Anfängern nicht empfehlen, das kann der Compiler mittlerweile besser.

Zahnlos72(R)

07.03.2023,
23:42

@ bastelix

for-Schleife Timing .....

» Klar, da kann man noch einiges machen:
»
» » for (int g=7;g>=0;g--) {
» » if(bitRead(COLOR[0][0], g)==0) {
» for (uint8_t g = 7; g >= 0; --g) {
» if ((COLOR[0][0] & ( 1 << g )) >> g) { /* ... */ } else { /* ... */ }
» }
»
» 1. --g statt g-- spart Arbeitsspeicher und (wenn ich mich richtig erinnere)
» drei CPU Zyklen.
» 2. Shift-Operator verwenden statt Methoden Aufruf spart einen
» Methodenaufruf... Außer wenn der Compiler die readBit-Aurufe eh inline
» macht, dann gewinnst lediglich schwerer lesbaren Code.
»
» So und wenn du wirklich schneller werden willst, dann schmeiß die Schleife
» weg und mach aus dem if je Bit einfach ein switch(CORLOR[0][0]) und für
» jede mögliche Konstellation die in der Variablen drin stehen kann einen
» case-Statement (die kann man auch zusammenfassen wenn für verschiedene
» Bitmuster das gleiche gemacht werden soll).
»
» Das mit dem prefix-Operator kannst du dir angewöhnen, das schadet nicht.
» Den postfix-Operator wirst du dann nur noch verwenden wenn du ihn wirklich
» brauchst ;-)
» Shift-Operatoren statt einer (inline) Methode würde ich Anfängern nicht
» empfehlen, das kann der Compiler mittlerweile besser.


Hallo !

Danke für Deine Hinweise.....hab´s mal nur so überflogen aber werde es dann testen....
Das mit der Schleife denke ich ist aber erforderlich, weil ja da der Dezimalwert in die Bits zerlegt wird...
Hatte vor dem If schon die ( Switch / Case mit break ) Methode.... das brachte aber nichts....
es ist die Schleife die Zeit braucht . Auch die While - Schleife wäre nicht schneller !
Seltsamerweise ist die Zeit abhängig vom Inhalt des Byte 00000000 ist schnell......00000001 ist schon merklich langsamer ! obwohl die Anzahl der Bits ja immer dieselbe ist.


lG

bastelix(R)

08.03.2023,
22:37

@ Zahnlos72

for-Schleife Timing .....

» weil ja da der Dezimalwert in die Bits zerlegt wird...
Andersrum wird eine Dezimalzahl draus: https://de.wikipedia.org/wiki/Einerkomplement (und nimmt bei 8-Bit-Prozessoren immer uint8_t für Schleifen so lange du nicht mit mehr als 256 Iterationen arbeiten musst)

» Hatte vor dem If schon die ( Switch / Case mit break ) Methode.... das
» brachte aber nichts....
» es ist die Schleife die Zeit braucht . Auch die While - Schleife wäre
» nicht schneller !
Ohne den ganzen Code zu kennen lässt sich das nicht abschätzen.

» Seltsamerweise ist die Zeit abhängig vom Inhalt des Byte 00000000 ist
» schnell......00000001 ist schon merklich langsamer ! obwohl die Anzahl der
» Bits ja immer dieselbe ist.
Und du meinst das liegt an der Schleife und nicht an den unterschiedlichen Aktionen die du bei 0x00 gegenüber 0x01 ausführst? Wie hast du die Messung durchgeführt?

Zahnlos72(R)

09.03.2023,
10:12

@ bastelix

for-Schleife Timing .....

» Seltsamerweise ist die Zeit abhängig vom Inhalt des Byte 00000000 ist
» schnell......00000001 ist schon merklich langsamer ! obwohl die Anzahl der
» Bits ja immer dieselbe ist.

Sorry... mein Fehler ! ....da habe ich mich anscheinend geirrt.....die Abstände sind doch unabhängig vom Byte - Wert !
Sie werden aber wohl immer von links nach rechts kleiner !

Dein Vorscchlag mit .....

» for (int g=7;g>=0;g--) {
» if(bitRead(COLOR[0][0], g)==0) {
» for (uint8_t g = 7; g >= 0; --g) {
» if ((COLOR[0][0] & ( 1 << g )) >> g) { /* ... */ } else { /* ... */ }
» }
» 1. --g statt g-- spart Arbeitsspeicher und (wenn ich mich richtig erinnere) drei CPU Zyklen.
» 2. Shift-Operator verwenden statt Methoden Aufruf spart einen Methodenaufruf... Außer wenn der Compiler die readBit-Aurufe eh inline macht, dann gewinnst lediglich » » » »schwerer lesbaren Code.
»So und wenn du wirklich schneller werden willst, dann schmeiß die Schleife weg und mach aus dem if je Bit einfach ein switch(CORLOR[0][0]) und für jede mögliche »Konstellation die in der Variablen drin stehen kann einen case-Statement (die kann man auch zusammenfassen wenn für verschiedene Bitmuster das gleiche gemacht »werden soll).
»Das mit dem prefix-Operator kannst du dir angewöhnen, das schadet nicht. Den postfix-Operator wirst du dann nur noch verwenden wenn du ihn wirklich brauchst ;-)
»Shift-Operatoren statt einer (inline) Methode würde ich Anfängern nicht empfehlen, das kann der Compiler mittlerweile besser.

...hat leider keine Besserung gebracht ....war sogar etwas langsamer !!!

!!! Das einzige was half war das Array nicht erst in der If - Schleife auszulesen sondern schon davor und in einer Variablen der Schleife zur Verfügung zu stellen. !!!


» Wie hast du die Messung
» durchgeführt?
Oszi ....


Aber vielen Dank trotzdem !

Zahnlos72(R)

09.03.2023,
12:52

@ Zahnlos72

for-Schleife Timing .....

» Sorry... mein Fehler ! ....da habe ich mich anscheinend geirrt.....die
» Abstände sind doch unabhängig vom Byte - Wert !
» Sie werden aber wohl immer von links nach rechts kleiner !

Hier noch ein Bild davon......


Das ist für GRÜN der Farb - Byte - Wert "255" ( breitere HIGHS )
die Anschliessenden ( rechts folgend ) sind für ROT ....Farb - Byte - Wert " 0 " ( schmälere HIGHS )

Die Abstände zwischen dem 8. Bit und dem 1. Bit werden immer schmäler !!!

Das war was ich meinte


lG