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
:
Gesperrt durch User
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 '/'.
Es gibt auch noch die Option signed beim Shiften. Shift L , Right , 1 , Signed '47 Takte
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?
Hi, der Overhead an Schrott ist hier manchmal echt gruselig. Aber solange sowas wie der Tipp von @mue_c bei rumkommt - immerhin. Gruß, Norbert
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. ...
Hallo Norbert, ich würde gerne auf Eure Homepage schauen. Wie lautet denn die URL? Gruss Guenter
Bitte sachlich und beim Thema bleiben "Bascom vs X" bitte als separatem Thread im OT diskutieren, persönliche Anfeindungen per PN...
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.