Moin,
ich möchte mal einen Tipp teilen.
Oft muß man ja skalieren und wenn man sich max. auf Long beschränken
möchte (was fast immer reicht), multipliziert und teilt man dann.
Bei Long kostet das richtig Zeit, vor allem das Teilen, also ist es
clever durch eine Zweierpotenz zu teilen und vorher entsprechend zu
muliplizieren.
Durch eine Zweierpotenz zu teilen macht man bekanntlich mit Shift
erheblich schneller nur leider ist Bascom da etwas doof. Bei /2 wird
gnadenlos geteilt, was bei einer Long 839 Takte dauert.
Shift behandelt die ganze Variable, daher funktioniert das nicht so ohne
weiteres wenn die Werte negativ werden können denn das Bit 31 bei einer
Long (oder 15 bei Integer) ist das Vorzeichen, 1 ist Minus.
Man kann aber trotzdem extrem Zeit sparen, wenn man das Vorzeichen
manuell mitschleppt.
Beispiel:
Dim L as Long
Dim Vorzeichen as Byte
L=-irgendwas
L=L/2
Das dauert 839 Takte
Vorzeichen = L.31
Shift L , Right
If Vorzeichen = 1 Then L = L + &H80000000
Das dauert 92 Takte, fast 10x schneller.
Bei positiven Werten sind es nur 58 Takte.
Es geht aber noch etwas flotter:
Vorzeichen = L.31
Shift L , Right
L.31 = Vorzeichen
64 Takte
Vielleicht kann ja jemand was damit anfangen.
Gruß,
Norbert
Norbert S. schrieb:> nur leider ist Bascom da etwas doof. Bei /2 wird> gnadenlos geteilt, was bei einer Long 839 Takte dauert.
Versuch doch mal '\' (Backslash) als Divisionszeichen und nicht '/'.
mue_c schrieb:> Es gibt auch noch die Option signed beim Shiften.> Shift L , Right , 1 , Signed '47 Takte
Cool, ich war kurz davor Marc vorzuschlagen, das mal einzubauen ;-)
Gruß,
Norbert
mue_c schrieb:> Es gibt auch noch die Option signed beim Shiften.> Shift L , Right , 1 , Signed '47 Takte
Hm, ist aber immer noch sportlich viel, oder?
8 Takte, um aus dem RAM in Register zu laden
3 Takte call _shift
4 Takte _shift
4 Takte return
8 Takte zurück ins RAM
Interessehalber - was passiert in den restlichen 20 Takten?
H.Joachim Seifert schrieb:> mue_c schrieb:>> Es gibt auch noch die Option signed beim Shiften.>> Shift L , Right , 1 , Signed '47 Takte>> Hm, ist aber immer noch sportlich viel, oder?>> 8 Takte, um aus dem RAM in Register zu laden> 3 Takte call _shift> 4 Takte _shift> 4 Takte return> 8 Takte zurück ins RAM>> Interessehalber - was passiert in den restlichen 20 Takten?
Hallo Jochen,
tja, keine Ahnung. Wenn ich mal zuviel Zeit habe kann ich mir das mal im
AVR-Studio ansehen bzw. veröffentlichen.
Ist mir aber auch relativ egal. Wenn ich mit Long rechne, muß ich eben
Zeit mitbringen. Die Zeit hat man fast immer bzw. kann sie sich nehmen.
In einer aktuellen Anwendung nutze ich z.B. Atan2, das ist Atangens über
4 Quadranten. 8000 Takte. Das wäre in diesem Fall locker mit einer
Tabelle zu machen, besser als 6bit Auflösung ist das Ergebnis sowieso
nicht. Aber wozu? Der µC rennt mit 11MHz und die Hauptschleife klappert
gemütlich mit 5ms und zählt ein Timingyte hoch. Die Rechnerei brauche
ich nur ein paar Mal pro Sekunde, also mache ich die nur, wenn das
Timingbyte mod 10 = 0 ist.
Ne andere umfängliche Rechnung bei timingbyte mod 10 = 1 usw...
Niemand behauptet, daß Bascom das Optimum ist aber es hat auch seine
Vorteile.
In erster Linie ist der Ruf wegen eines Vorteils so schlecht:
Weil es so einfach ist, kommt jeder Neuling damit klar und daher tauchen
teilweise haarsträubende Fragen auf.
Daß man mit Bascom durchaus ernsthafte Dinge anstellen kann, dürftest Du
ja wissen ;-)
Kannst ja mal auf unsere Homepage schauen, was wir inzwischen machen.
Alles Bascom.
Gruß,
Norbert
Norbert S. schrieb:> Shift behandelt die ganze Variable, daher funktioniert das nicht so ohne> weiteres wenn die Werte negativ werden können denn das Bit 31 bei einer> Long (oder 15 bei Integer) ist das Vorzeichen, 1 ist Minus.> Man kann aber trotzdem extrem Zeit sparen, wenn man das Vorzeichen> manuell mitschleppt.
Häh? Genau dafür gibt es ASR
asr TEMP4
ror TEMP3
ror TEMP2
ror TEMP1
4 Takte, um verzeichenbehaftet ein Long durch 2 zu teilen. Um das noch
zu optimieren, müsste man dann wohl einen 32-Bitter nehmen...
Timm Thaler schrieb:> 4 Takte, um verzeichenbehaftet ein Long durch 2 zu teilen.
Richtig.
Aber Hochsprachen halten trotz der 32 verfügbaren Register ihre
Variablen im SRAM. Also müssen noch Register freigemacht (push/pop)
werden, RAM in Register und wieder zurück kopiert werden.
Muss durch 256 oder 65536 geteilt werden, dann geht das auch mal ganz
ohne Rechnen im AVR, auch in Bascom. Da castet man mittels Dim-Overlay
einfach ein Word oder Integer byteversetzt auf ein Long:
Dim Summe As Long 'Summe für Mittelwert Referenz
Dim Referenz As Word At Summe + 1 Overlay 'Referenz=Summe/256
Das geht auch gut zum Skalieren, indem man den Skalierfaktor zum
gemeinen Bruch mit 256 oder 65536 im Nenner erweitert. Den Zähler (des
Bruches) nimmt man dann als Anzahl der Aufsummierungen (bei der
Messung), die Division erledigt dann das Casting.
...
Läubi .. schrieb:> Bitte sachlich und beim Thema bleiben "Bascom vs X" bitte als separatem> Thread im OT diskutieren, persönliche Anfeindungen per PN...GLUECKWUNSCH Moderator !!! zum TH ruinierer des Jahres
der Beitrag sieht jetzt wie von Motten zerfressen aus.........
da hat doch keiner gegen irgendwelche 'Sitten' vestossen,
wieso loescht du mehr als die Haelfte davon?, wieso zwingst du
uns deine Meinung/Einstellung auf?, meine Meinung dazu: scheisse!
(so begann es auch in den 30er Jahren)
erstellt 04082013/23:15 , mal sehen die lang der Beitrag ueberlebt...
Charly B. schrieb:> Läubi .. schrieb:>> Bitte sachlich und beim Thema bleiben "Bascom vs X" bitte als separatem>> Thread im OT diskutieren, persönliche Anfeindungen per PN...>> GLUECKWUNSCH Moderator !!! zum TH ruinierer des Jahres>>> der Beitrag sieht jetzt wie von Motten zerfressen aus.........> da hat doch keiner gegen irgendwelche 'Sitten' vestossen,
Doch.
> wieso loescht du mehr als die Haelfte davon?
Weil er es für richtig erachtet hat. Und ich teile seine Meinung.
>, wieso zwingst du> uns deine Meinung/Einstellung auf?
Weil wir Moderatoren vom Forumsbetreiber dazu ernannt wurden, auf
Threads ein Auge zu werfen. Genau solche Zwischenmeldungen, wie sie in
diesem Thread aufgetaucht sind, wollen wir hier nicht haben. Das muss
dir nicht gefallen - auch gut. Keiner zwingt dich hier zu posten oder zu
lesen.
>, meine Meinung dazu: scheisse!> (so begann es auch in den 30er Jahren)
Lern erst mal Geschichte.
> erstellt 04082013/23:15 , mal sehen die lang der Beitrag ueberlebt...
Überleben wird er. Immerhin bietet er ja so wie er ist nützliche
Information. Lediglich das "Meine Sprache ist besser als deine und deine
Sprache ist Scheisse"-Bashing wurde rausgelöscht.