Befehlserweiterung für B3D

Übersicht BlitzBasic Allgemein

Gehe zu Seite Zurück  1, 2

Neue Antwort erstellen

Thunder

BeitragDi, Nov 02, 2010 13:24
Antworten mit Zitat
Benutzer-Profile anzeigen
GERMAX:

Ich habe nun meine eigenen Messungen durchgeführt, jedoch nicht zur bset-Funktion (bei der es logisch ist, dass sie langsamer ist), sondern ich habe die Variante mit bsf getestet, die wirklich schneller war - ich muss dazu sagen, dass ich den Befehl nicht kannte.

Code: [AUSKLAPPEN]
int bscan(int zahl){
    asm volatile(    "movl %0,%%edx\n"
                    "bsf %%edx,%%eax" :: "m" (zahl));
}


Nach 100.000 Durchläufen braucht die Funktion im ein 257stel der Zeit, die eine BB-Funktion dazu braucht.
Aber ich sehe ehrlich gesagt, keinen Sinn in der Suche nach dem ersten gesetzten Bit - kennst du ein praktisches Beispiel?

Außerdem wird der Unterschied erst ab mehr als 1.000 Aufrufen spürbar für MilliSecs().

mfg Thunder
Meine Sachen: https://bitbucket.org/chtisgit https://github.com/chtisgit
 

GERMAX

BeitragMi, Nov 03, 2010 23:23
Antworten mit Zitat
Benutzer-Profile anzeigen
@Thunder
Ja, das man bei der Sache kaum einen speed-Gewinn machen kann, verwundert natürlich nicht. Ich hatte aber auch zugegeben, dass ich das eher aus purer Bequemlichkeit bzw eher Gewohnheit und Klarheit des Codes so machen wollte.

Und dass der nachgebaute um einiges langsamer sein würde, hatte ich ja in einem eigenen Beitrag schon "angedroht" Smile

Was wiederum mit der Suche ist, hängt natürlich vom Programmierstil ab-da gibt es keinen ..da und da muß man es nehmen usw. Ich benutze sowas, um eine freie Stelle in einer Variable zu finden, das funktioniert so quasi wie ein index für eine Tabelle (und damit muß ich die natürlich auch wieder löschen können).

Das mit der Geschwindigkeit wiederum darf man natürlich nicht nur an diesem einen Befehl festmachen, die Mischung macht es aus.

Vorgestern jedenfalls habe ich in die dll noch eine weitere function reingenommen.
Es handelt sich dabei um ein typ Einfallswinkel/Mauerwinkel/Ausfallswinkel Berechnung.

Um die Sache auf absoluten HSpeed zu trimmen, standen 2 Variationen zur Auswahl. Bei Tests hat es sich herausgestellt, dass

V1 im Mittel 47.95 ms brauchte. V2 46.19ms.
Da V2 also ca. 3.8% schneller war, darf die ab sofort ins Körbchen, wobei die V1 in den Datenshredder wanderte. Wink Wer zu blöde ist, wird eben von der Evolution dahingerafft. Evil or Very Mad

Messungen mit einer entsprechenden B3D-Variante (bei ungewöhnl. Streuung) ergaben einen Vorteil von etwa 300%(+) Leistung der Assembler-Version (bei Bevorzugung der B3D-Variante, wg. Streuung!).

Momentan bin ich grade bei einer 2-D Distanzmessung (als Vorstufe für Distanzen im Raum).

Code: [AUSKLAPPEN]
oldTime#=MilliSecs()
For i=1 To 50000000
distanz%= Sqr((x1-x2)^2+(y1-y2)^2)
Next
Print "distanz="+distanz
newTime#=MilliSecs()
Print newTime-oldTime
WaitKey()
End


Wer Lust hat, kann den mal ausprobieren oder eine schnellere Variante vorstellen. Komischerweise habe ich in der Hilfe nix gesehen. Anscheinend gibt es einen derartigen Befehl in BB/B3D gar nicht. Wenn doch, werde ich das dann natürlich berücksichtigen. Um Ergebnisse wird gebeten (ms/cpu-typ Ghz).

@Noobody:
Mit der Wichtigkeit von Bitoperationen liegst du sowieso sowas von daneben. Das kannst du gar nicht beurteilen, weil Programme x-mal in dll's springen, wo man sowas von oben gar nicht mitkriegt.
Erfolglos begonnene BB-Projekte:TRON/CONVOY/MYSTIC
 

mDave

BeitragDo, Nov 04, 2010 7:31
Antworten mit Zitat
Benutzer-Profile anzeigen
Eine Zahl mit Exponenten versehen ist ziemlich langsam.
Deshalb kann man aus der Zeile
BlitzBasic: [AUSKLAPPEN]
distanz%= Sqr((x1-x2)^2+(y1-y2)^2)

das hier machen:
BlitzBasic: [AUSKLAPPEN]
distanz%= Sqr((x1-x2)*(x1-x2)+(y1-y2)*(y1-y2))


Bei 50.000.000 Aufrufen dauert das obere bei mir 5489ms, das untere hingegen nur 609ms.

Eingeproggt

BeitragDo, Nov 04, 2010 12:57
Antworten mit Zitat
Benutzer-Profile anzeigen
Es ist und bleibt leider so wie Bladerunner es sagt. Du versuchst jede Nanosekunde rauszukitzeln aber vernachlässigst dabei viel gröberes.
Die Sache die mDave geschrieben hat natürlich allen voran. Aber dafür will ich dich gar nicht ankreiden. Kann ja wirklich sein dass du den Trick nicht kanntest - soweit kein Problem.
Es kommt nur bei so Tests wie du sie hier zeigst noch etwas dazu was hectic an anderer Stelle (weiß leider nimma wo) sehr schön beschrieben hat:
Wenn du 5Mio mal dieselbe Rechnung ausführst, dann heißt das nicht dass die CPU 5Mio mal dasselbe rechnet. (Ich möchte an dieser Stelle hervorheben dass du in der For Schleife einen "konstanten" Audruck hast, der wirklich 5Mio mal dasselbe ergibt - die Schleifenvariable i wird nicht miteingerechnet) Auch die Hardware ist optimiert und intelligent genug, ihre mittlerweile Megabytes großen Caches zu benutzen. Das ganze spielt sich unbeeinflussbar von dir ab, verfälscht jedoch deine Ergebnisse.

mfG, Christoph.
Gewinner des BCC 18, 33 und 65 sowie MiniBCC 9
 

GERMAX

BeitragFr, Nov 05, 2010 2:42
Antworten mit Zitat
Benutzer-Profile anzeigen
dx=x1-x2,dy=y1-y2,dz=z1-z2: sqrtf( dx*dx+dy*dy+dz*dz )

Den Code habe ich in dem Ordner userlibs gestern noch gefunden und abgewandelt:

dx=x1-x2:dy=y1-y2:vvv%=Sqr(dx*dx+dy*dy) . Ist "natürlich" auch viel schneller (ca. 525ms bei mir).
Da lohnt sich im Code dochmal nachzuschauen, ob man sowas nicht ausversehen drinne hat.

@Eingeproggt
Die Sache mit dem Exponenten kann den Geschwindigkeitsunterschied bestimmt (allein) nicht erklären, denn mit der FPU ist das kein Problem. Mal abgsehen davon - ist schon erstaunl., wie da plötzlich von Trick gesprochen wird, wo bei 50 mio Aufrufen und mit geänderten Daten dann sowieso die Messung streut (um das herauszufinden, gibt es statistische Methoden-und daraus wird ein Mittelwert gebildet) und angebl. alles durch die Hardware optimiert ist. Dann bräuchte man den "Trick" ja auch nicht mehr, denn der beweist doch genau das, was du in deinem Beitrag klar abstreitest.

Ansonsten kann man an deinen Aussagen noch festhalten, dass ein Compiler keinen optimalen Code erzeugt, wie ich das mit dem Ausfallswinkel dargelegt habe-aber Daten werden eben einfach ignoriert wenn sie nicht ins Weltbild passen. Und ein 1/3 Speed für angeblich superschnelles BB ist keine wirklich gute Performance (und widerlegt wiederum deine Behauptung).
Erfolglos begonnene BB-Projekte:TRON/CONVOY/MYSTIC

Thunder

BeitragFr, Nov 05, 2010 16:07
Antworten mit Zitat
Benutzer-Profile anzeigen
Ich glaube die meisten sehen einfach keinen Sinn dahinter wegen ein paar Bitoperationen eine DLL mitzuliefern. Ich zumindest habe es am liebsten, wenn ich alles in eine exe packen kann - deswegen arbeite ich hauptsächlich mit BlitzMax.
Meine Sachen: https://bitbucket.org/chtisgit https://github.com/chtisgit

BladeRunner

Moderator

BeitragSa, Nov 06, 2010 6:29
Antworten mit Zitat
Benutzer-Profile anzeigen
Ach Leutz, ist gut jetzt. Lasst ihn seine Dll basteln und benutzen und der Rest macht weiter wie gehabt. Ich erwarte einen freundlichen Ton hier, von allen Beteiligten, denn sobald das hier nur einen Schritt weiter Richtung Glaubenskrieg wandert pack ich den Moderator aus der Tasche und mach dicht.

Wie gesagt: viel Erfolg weiterhin, Germax. Dir deine Art zu optimieren, uns die unsere. Alle glücklich.
Zu Diensten, Bürger.
Intel T2300, 2.5GB DDR 533, Mobility Radeon X1600 Win XP Home SP3
Intel T8400, 4GB DDR3, Nvidia GF9700M GTS Win 7/64
B3D BMax MaxGUI

Stolzer Gewinner des BAC#48, #52 & #92

Gehe zu Seite Zurück  1, 2

Neue Antwort erstellen


Übersicht BlitzBasic Allgemein

Gehe zu:

Powered by phpBB © 2001 - 2006, phpBB Group