c-code Schneller in Assembler?

Gast #3420649
Lesenswert?

Hallo ich habe ein kleines Problem.
Ich Programmierte schon Immer in Basic oder C...
Nun komme ich aber bei einer Sache an die Rechen/zeit Grenze eines
Mc`s...

habe folgenden Code:
1
  if (G==126)
2
  {R++;}
3
  if (R==126)
4
  {G--;}
5
  if (R==126)
6
  {B++;}
7
  if (B==126)
8
  {R--;}
9
  if (B==126)
10
  {G++;}
11
  if (G==126)
12
  {B--;}
gibt es eine Möglichkeit diesen Code wesentlich schneller durch zu 
rechnen?

lg
Demont
Gast #3420657
Lesenswert?

Demont schrieb:
> gibt es eine Möglichkeit diesen Code wesentlich schneller durch zu
> rechnen?

wenn du uns sagst was das überhaupt werden soll, kann man bestimmt etwas 
machen.

 if (R==126) {G--;}
 if (R==126) {B++;}

sieht schon sehr merkwürdig aus, warum 2 vergleiche?
Gast #3420675
Lesenswert?

Hier war einfach die frage ob die IF anweisung schneller Möglich ist
z.b. in Essabler.
Wenn ja Wie?

Es ist egal was damit bezweckt wird
Man hat die die 3 Variablem die in/de-decrementiert werden
über einfache if anweisungen
#3420681
Lesenswert?

Demont schrieb:
> gibt es eine Möglichkeit diesen Code wesentlich schneller durch zu
> rechnen?

Solcher Code ist bereits sehr schnell. Fürs de- und inkrementieren 
besitzen die meisten Controller einen eigenen Befehl und solche 
Vergleiche können auch sehr einfach umgesetzt werden. Die beiden Werte 
werden subtrahiert und wenn danach das Zero Flag gesetzt ist, sind die 
beiden Werte identisch. Schau mal den generierten Assembler an.

Wie kommst du auf die Idee, dass genau dieser Codeabschnitt dafür sorgt, 
dass dein Programm zu langsam ist? Muss dieser Codeabschnitt tausende 
Male pro Sekunde durchlaufen werden?
#3420684
Lesenswert?

Peter II schrieb:
>  if (R==126) {G--;}
>  if (R==126) {B++;}
>
> sieht schon sehr merkwürdig aus, warum 2 vergleiche?

Weil er beide Farbkanäle unabhängig voneinander ändern will. Nutze mal 
lieber die Präfix-Operatoren (z.B. --G oder ++B), da dort keine Kopie 
erzeugt wird.

Ansonsten, beschleunigen kannste immer über:
- Wertetabelle mit vorberechneten Werten
- zu verarbeitende Daten reduzieren (muss denn voller Bereich genutzt 
werden?)
- algorithmisch clevere Lösungen über Farbräume
Gast #3420688
Lesenswert?

be stucki schrieb:
> Demont schrieb:
>> gibt es eine Möglichkeit diesen Code wesentlich schneller durch zu
>> rechnen?
>
> Solcher Code ist bereits sehr schnell. Fürs de- und inkrementieren
> besitzen die meisten Controller einen eigenen Befehl und solche
> Vergleiche können auch sehr einfach umgesetzt werden. Die beiden Werte
> werden subtrahiert und wenn danach das Zero Flag gesetzt ist, sind die
> beiden Werte identisch. Schau mal den generierten Assembler an.
>
> Wie kommst du auf die Idee, dass genau dieser Codeabschnitt dafür sorgt,
> dass dein Programm zu langsam ist? Muss dieser Codeabschnitt tausende
> Male pro Sekunde durchlaufen werden?

Ja das wird er... mir fehlen 3µS für eine Passende sync :/
Ohne diese Abfrage geht es, mit 5 dieser If Abfragen klappt es auch
nur mit der 6 Dauert es zu lange :/
Gast #3420698
Lesenswert?

Hast Du alle Optimierungsmöglichkeiten /O? ausgenutzt.

Ich sehe oft, dass "C", wenn man eine Variable mehrfach vergleicht, 
diese auch mehrfach holt.

So etwas sieht man in Assembler sofort bzw. macht man erst gar nicht.

Hilf Deinem Compiler etwas, indem Du, wenn schon nötig, Vergleiche auf 
die gleiche Variable, dicht hintereinander schreibst. Die Optimierung 
über mehrere Zeilen hinweg bedingt eine Umformatierung des Quelltextes – 
keine Ahnung wie Klever der Compiler dabei ist.

Aber die aktuellen Compiler optimieren meist recht gut.

Keine Ahnung welchen Compiler und welches System Du benutzt, aber rund 
ums Gnu ist die Mischung von C und Assembler kein Problem.
Gast #3420700
Lesenswert?

Falk Schilling schrieb:
> Peter II schrieb:
>>  if (R==126) {G--;}
>>  if (R==126) {B++;}
>>
>> sieht schon sehr merkwürdig aus, warum 2 vergleiche?
>
> Weil er beide Farbkanäle unabhängig voneinander ändern will. Nutze mal
> lieber die Präfix-Operatoren (z.B. --G oder ++B), da dort keine Kopie
> erzeugt wird.
>
> Ansonsten, beschleunigen kannste immer über:
> - Wertetabelle mit vorberechneten Werten
> - zu verarbeitende Daten reduzieren (muss denn voller Bereich genutzt
> werden?)
> - algorithmisch clevere Lösungen über Farbräume

Also anstelle von g-- dann --g
kk probiere ich

Wertetabellen... (leider nicht mehr genug Speicher vorhanden)
V Daten reduzieren... Schon auf minimum (daher die if abfragung)
Alg.... Hier die schnellste und beste variante gewählt die mir einfällt.
Ich habe hier ein voll Modulares System das pro Durchgang die Farbe,Die 
position und den datenwert ändert. Tiny und 800KBit datenübertragung auf 
einem normalen Port mit Live berechnung des Codes... wie gesagt das 
alles ist schon recht Optimiert... mir fehlt nur da ein paar nano 
sekunden
Gast #3420701
Lesenswert?

Demont schrieb:
> Ohne diese Abfrage geht es, mit 5 dieser If Abfragen klappt es auch
> nur mit der 6 Dauert es zu lange :/

dann lass doch eine weg.

if (G==126) {R++;}

if (R==126) {G--;}
if (R==126) {B++;}


if (B==126) {R--;}
if (B==126) {G++;}


if (G==126) {B--;}

die beiden abfragen kannst du einfach zusammenlegen, es ändert nicht am 
ergebniss.

if (G==126) {R++;}
if (R==126) {G--; B++; }
if (B==126) {R--; G++; }
if (G==126) {B--;}

liefert genau das gleiche.
Gast #3420714
Lesenswert?

Peter II schrieb:
> Demont schrieb:
>> Ohne diese Abfrage geht es, mit 5 dieser If Abfragen klappt es auch
>> nur mit der 6 Dauert es zu lange :/
>
> dann lass doch eine weg.
>
> if (G==126) {R++;}
>
> if (R==126) {G--;}
> if (R==126) {B++;}
>
> if (B==126) {R--;}
> if (B==126) {G++;}
>
> if (G==126) {B--;}
>
> die beiden abfragen kannst du einfach zusammenlegen, es ändert nicht am
> ergebniss.
>
> if (G==126) {R++;}
> if (R==126) {G--; B++; }
> if (B==126) {R--; G++; }
> if (G==126) {B--;}
>
> liefert genau das gleiche.

Sry hatte leider den Falschen Code gepostet Sry :(
Hatte das schon so optimiert gehabt hatte sich aber noch nicht mit dem 
anderen Pc sync gehabt (1pc zum Proggen und einen zum Arbeiten)
War schon so gewesen
...

Die Mmstellung (b-- auf --b)gab leider keine besserung...

Kann mir eventeull jemand sagen wie das Mit dem ASM code funktioniert 
mit dieser vergleichs if anweisung die ich dort verwendet habe?

lg
demont
Gast #3420727
Lesenswert?

>Sry hatte leider den Falschen Code gepostet Sry :(

Trottel. Viel Rauch um nichts. Pass beim nächsten
mal besser auf.

>Kann mir eventeull jemand sagen wie das Mit dem ASM code funktioniert
>mit dieser vergleichs if anweisung die ich dort verwendet habe?

Wozu? Bringt nichts mehr. Kauf dir nen schnelleren Controller.
Gast #3420733
Lesenswert?

holger schrieb:
>>Sry hatte leider den Falschen Code gepostet Sry :(
>
> Trottel. Viel Rauch um nichts. Pass beim nächsten
> mal besser auf.
>
>>Kann mir eventeull jemand sagen wie das Mit dem ASM code funktioniert
>>mit dieser vergleichs if anweisung die ich dort verwendet habe?
>
> Wozu? Bringt nichts mehr. Kauf dir nen schnelleren Controller.
Trottel weil ich vergessen habe das optimierte rein zu stellen anstelle 
von dem optimiertem? Obwohl die Problematik beim Optimierten code 
besteht...

Deine Geistige Auffassungsgabe ist ja beachtlich...

du hast dich der in diesem Thema somit erfolgreich selbst 
ausgeschlossen...

Einfache Frage, und du haust so ein shit raus kopfschüttel



@
Peter Z
Danke für den Tipp ich schaue es mir mal an ^^
Gast #3420746
Lesenswert?

>Deine Geistige Auffassungsgabe ist ja beachtlich...

Du willst einen LED Stripe mit W28shit Controller mit einem
Tiny befeuern. Das RAM reicht nicht und deshalb musst du alles
online berechnen. Soviel mal zu meiner Auffassungsgabe.

Nimm einen Controller mit mehr RAM dann geht das auch.
Gast #3420762
Lesenswert?

holger schrieb:
>>Deine Geistige Auffassungsgabe ist ja beachtlich...
>
> Du willst einen LED Stripe mit W28shit Controller mit einem
> Tiny befeuern. Das RAM reicht nicht und deshalb musst du alles
> online berechnen. Soviel mal zu meiner Auffassungsgabe.
>
> Nimm einen Controller mit mehr RAM dann geht das auch.

WOW und das war ja jetzt so schwehr aus den Informationen zu erfassen 
-.-
Ich habe mit den Infos die ich gegeben habe, diese Schlussfolgerung 
jedem Fast ins Gesicht geklatscht.

Aja du kennst natürlich die Umgebung in der das System verwendet wird.
In verwendung habe ich einen Tiny85 2000 Zeilen Programmcode (von knapp 
6000 optimiert),96,4% Progammspeichernutzung, alle i/o Pins genutzt.
Ich habe dort wo ich es verwende kaum bist keinen Platz.
Alles Funktioniert wie es soll...
Dieser Part dort oben ist nur ein Autonomer Modus der somit als 
zusätzliche Option zur Verfügung stehen sollte. u.s.w.

Aber tut mir leid das ich dir wiederspreche, da du ja Absolut genau 
weist WAS
ich vor habe und wie ich dies umsetzten will unter welchen Bedingungen
GZ.
Kopfschüttel
Gast #3420772
Lesenswert?

Das einzige was Du an diesen Befehlen 'optimieren' könntest wäre 126 
durch 0 zu ersetzen. Eine 0-Abfrage ist schneller. Aber vermutlich macht 
Dir das den Rest kaputt. Was wird denn mir RG und B gemacht?
Gast #3420773
Lesenswert?

Edit:
noch zum Tiny
Bereits 12 Autonome Programme drauf
3 Steuerbare Programme
Leds die Betrieben werden können ( getestet 600 LEDs in Reihe bei 50 
Änderungen die Sekunde... mehr hatte ich nicht da)
SO VIEL ZU MIT TINY KLAPPT DAS NICHT!
Gast #3420904
Lesenswert?

Demont schrieb:
> Trottel weil ich vergessen habe das optimierte rein zu stellen anstelle
> von dem optimiertem?

Weil du anderen, die dir freiwillig und ohne Gegenleistung helfen 
wollen, unnötig Arbeit machst. Und weil du erstmal geschrieben hast, daß 
uns nicht zu interessieren hat, wofür du das brauchst und wir gefälligst 
deine Frage beantworten sollen. Oft (aber natürlich auch nicht immer) 
ergibt sich aber auch aus dem Gesamtzusammenhang eine Alternative. 
Algorithmisch läßt sich halt in der Regel mehr rausholen als durch 
Mikrooptimierungen an einzelnen if-Abfragen oder Inkrementierungen.

Demont schrieb:
> mir fehlen 3µS für eine Passende sync :/
> Ohne diese Abfrage geht es, mit 5 dieser If Abfragen klappt es auch
> nur mit der 6 Dauert es zu lange :/

Mit welcher Taktrate läuft der µC denn? Bei den eingebauten 8 Mhz z.B. 
wären 3 µs ja 24 Taktzyklen. Es wäre etwas verwunderlich, wenn eine 
einzelne if-Abfrage mit Inkrementierung so viel brauchen würde, vor 
allem, wenn durch die vorherigen Abfragen eh schon alle Variablen in 
Registern liegen. Mehr als 3 Taktzyklen darf das eigentlich nicht 
brauchen, wenn's in 8 Bit gerechnet wird und die Variablen nicht grad 
alle volatile sind. Generell kam ja auch schon der Tipp, sich mal den 
generierten Assembler-Code anzuschauen. Poste den doch mal, damit man 
sieht, was der Compiler daraus macht.
#3421020
Lesenswert?

Peter II schrieb:
> Walter Tarpan schrieb:
>> Das bringt wirklich etwas?
>
> nein macht es nicht. Auf keine Fall bei einfachen Datentypen. Bei C++
> mit überlanden Operatoren kann es durch aus einen unterschied machen.

Kommt auf den Compiler und die Architektur an. Und selbst wenn es nix 
bringt, ist es guter Stil, bewusst auf die implizite Kopie zu 
verzichten, auch bei POD.

@Demont:
Sind deine Increments um 1 so wichtig oder kannste auch in größeren 
Schritten erhöhen, dafür aber seltener?
#3421043
Lesenswert?

Rolf Magnus schrieb:
> Demont schrieb:
>> Trottel weil ich vergessen habe das optimierte rein zu stellen anstelle
>> von dem optimiertem?
>
> Weil du anderen, die dir freiwillig und ohne Gegenleistung helfen
> wollen, unnötig Arbeit machst. Und weil du erstmal geschrieben hast, daß
> uns nicht zu interessieren hat, wofür du das brauchst und wir gefälligst
> deine Frage beantworten sollen.

Rolf, ist Dir nicht aufgefallen, wie viele, sonst sehr hilfsbereite, 
Forenbenutzer sich bei diesem Thread deutlich zurückhalten ? Warum wohl 
?

/IRONY ON
Aber vielleicht fehlt  es ja auch nur an den speziellen Kenntnissen in:

Demont schrieb:
> z.b. in Essabler.
/IRONY OFF

Oder vielleicht, weil sie immer noch auf das Asm-Listing und die immer 
noch "geheimen" Compilersettings warten ? Wer weiss .... ;-)

Grüße
Andreas
Gast #3421073
Lesenswert?

Rolf Magnus schrieb:
> Mit welcher Taktrate läuft der µC denn? Bei den eingebauten 8 Mhz z.B.
> wären 3 µs ja 24 Taktzyklen.

Er läuft mit internen 16Mhz über den Pll.
... ohne diese if anweisungen Klappt alles wunder bar.
Diese If Anweisungen brauchen leider zu viel Zeit und die funktion 
funktioniert dadurch nicht mehr.

Rolf Magnus schrieb:
> Generell kam ja auch schon der Tipp, sich mal den
> generierten Assembler-Code anzuschauen.

Ok ich versuche die Stelle zu finden wenn ich wieder zuhause bin.

Karl Heinz schrieb:
> Und wenn du schon am posten bist ... dann bitte gleich etwas mehr aus
> der Umgebung der Codestelle. Die Datentypen der Variablen, die generelle
> Strategie, ... eigentlich am besten alles.

jo 2000 Zeilen schon komprimierter und Optimierter Programmcode viel 
spaß.
Das System habe ich Modular programmiert. Wie ich schon sagte 
funktioniert ALLES. Das einzige was zeitlich nicht Funktioniert ist 
dieser weitere Modus und das ist die einzige stelle an der ich noch 
Optimieren kann.

Falk Schilling schrieb:
> Kommt auf den Compiler und die Architektur an. Und selbst wenn es nix
> bringt, ist es guter Stil, bewusst auf die implizite Kopie zu
> verzichten, auch bei POD.

AVR Studio 6 verwende ich
Die Datei wird erstellt und ich weis auch wo diese ist, nur gestern
war es schon spät, werde heute mal den Assebler code durchforsten
und schauen ob ich den Passus finde.

Falk Schilling schrieb:
> @Demont:
> Sind deine Increments um 1 so wichtig oder kannste auch in größeren
> Schritten erhöhen, dafür aber seltener?

Seltener geht nicht da ich immer:
Phasenverschiebungsschleife//
Anzahlschleife//
Sende->berechne->Sende->berechne

...
Diese Berechnung funktioniert bei meinen Anderen Modis hervorragen.
nur hier fehlt mir ein wenig Zeit.
Gast #3421103
Lesenswert?

Demont schrieb:
> ... ohne diese if anweisungen Klappt alles wunder bar.

Vielleicht optimiert der Compiler aber viel Code weg wenn diese 
Anweisungen nicht mehr da sind. D.h. es kann sein, dass diese 
Anweisungen nicht das Problem sind.

Demont schrieb:
> jo 2000 Zeilen schon komprimierter und Optimierter Programmcode viel
> spaß.

Man komprimiert keinen Code!

Demont schrieb:
> der ich noch
> Optimieren kann.

Betonung liegt auf 'ich'. Vielleicht können andere woanders etwas 
optimieren.
#3421142
Lesenswert?

Demont schrieb:

> Karl Heinz schrieb:
>> Und wenn du schon am posten bist ... dann bitte gleich etwas mehr aus
>> der Umgebung der Codestelle. Die Datentypen der Variablen, die generelle
>> Strategie, ... eigentlich am besten alles.
>
> jo 2000 Zeilen schon komprimierter und Optimierter Programmcode viel
> spaß.

Dann eben nicht.
Es ist dein Code und wenn der so aussieht wie der Abschnitt da oben, 
dann wundert mich gar nichts mehr.


2000 Zeilen. Du glaubst echt, sowas schreckt mich? Ich arbeite jeden Tag 
mit einem Programmsystem das aus rund 2.5 Millionen Lines of Code 
besteht. Denkst du echt, dass mich 2000 Zeilen schrecken? Aber behalt 
ihn für dich. Der wird schon so aussehen, dass man ihn am liebsten in 
die Tonne treten möchte.
Gast #3421202
Lesenswert?

Haters gonna hate...
waren ü13.000 gewesen die ich auf 6.000 runter kürzen und auf 2000 
Optimiren konnte.
nun genug darüber gehatet...
Es ist Traurig wie eine einfache Frage so auseinander genommen werden 
kann ohne auch nur eine teilweiese Antwort zu geben :(

Einfache frage:

WENN R==128
DANN G++,B--

und das in ASM
Aber bisher hat es keiner der sich posierenden Experten hinbekommen.
(Karl Heinz ,lalala ,Andreas H ,Holger)
Gratulation.
#3421235
Lesenswert?

Demont schrieb:

> Es ist Traurig wie eine einfache Frage so auseinander genommen werden
> kann ohne auch nur eine teilweiese Antwort zu geben :(

Das einzig traurige ist, dass du nicht verstehst, dass es an dieser 
Stelle nichts zu 'optimieren' gibt. Was willst du denn da optimieren? 
Einen Vergleich? Du hälts wohl Compilerbauer für komplette Vollidioten.

Wenn sich was verbessern lässt, dann muss man im größeren Kontext 
ansetzen. Aber das willst du ja nicht.
Gast #3421240
Lesenswert?

Peter II schrieb:
> weil das der Compiler so schon gut kann, das man es selber nicht besser
> machen kann.

Danke das ist mal eine gute Antwort ^^


Karl Heinz schrieb:
> Oliver schrieb:
>> Karl Heinz schrieb:
>>> 2000 Zeilen. Du glaubst echt, sowas schreckt mich?
>>
>> 2000 Zeilen "optimierter und komprimierter" Code sollten jeden
>> schrecken...
>
> Du hast noch nie den Code gesehen, den ich 'geerbt' habe. Seit dem
> schreckt mich nichts mehr :-)

SPAM

Hanno schrieb:
> Demont schrieb:
>
>> Es ist Traurig wie eine einfache Frage so auseinander genommen werden
>> kann ohne auch nur eine teilweiese Antwort zu geben :(
>
> Traurig ist deine Lern- bzw. Beratungsresistenz.

SPAM

Karl Heinz schrieb:
> Das einzig traurige ist, dass du nicht verstehst, dass es an dieser
> Stelle nichts zu 'optimieren' gibt.

Das erste Nützliche von dir. Das ist eine Aussage mit der man Arbeiten 
kann.
Leider schon  von Peter II beantwortet somit
SPAM
Gast #3421248
Lesenswert?

Wenn der Pfosten es geschafft hätte sich mal das ASM-Listing dazu 
anzuschauen, wüsste er es selber das da mit ASM per Hand nichts zu holen 
ist.

Soviel zu seiner "Code-Optimierung" der fantastillionen Zeilen...
Dieser Beitrag ist gesperrt und kann nicht beantwortet werden.