Function/Gosub - Geschwindigkeitsvergleich
Übersicht

![]() |
XaronBetreff: Function/Gosub - Geschwindigkeitsvergleich |
![]() Antworten mit Zitat ![]() |
---|---|---|
Hi allerseits!
Ich habe jetzt schon oft gelesen, dass Gosub wesentlich schneller als die Verwendung von Funktionen sein soll. Das konnte ich noch nie so ganz nachvollziehen (komme aus der C++ Ecke), da bei einer Funktion ja nicht wesentlich mehr passiert als bei Gosub. In beiden Fällen wird die Rücksprungadresse auf den Stack gelegt. Ein Unterschied ist halt die Verwendung lokaler Variablen, die bei Funktionen auch auf dem Stack liegen (wie lokale Variablen eigentlich immer ![]() Nun möchte ich also mit dem Vorurteil aufräumen, dass Gosub schneller ist, denn der Unterschied ist marginal. Kommen wir also zu meinem kleinen Testprogramm. Ich rufe jeweils 100.000 mal eine Funktion auf, die den Sinus von 0-359 berechnet. Das gleiche mache ich mit Gosub und zuletzt sogar rekursiv, um den Stack ein wenig zu "füllen". Die Ergebnisse sagen mir das, was ich schon vermutet hatte. Es gibt keinesfalls einen großen Geschwindigkeitsvorteil durch Verwendung von Gosub, was damit eigentlich, genau wie Goto, in der Versenkung verschwinden sollte. ![]() BlitzBasic: [AUSKLAPPEN]
Die Zeiten liegen alle so um die 3500ms bei mir, Gosub ist minimal schneller, aber wirklich nicht relevant. Für alle, die es interessiert, hier noch das C++ Gegenstück für den ersten Fall: Code: [AUSKLAPPEN] #include <iostream> #include <math.h> #include <time.h> #include <windows.h> using namespace std; float a[360]; void sub1(void) { for( int k = 0; k < 360; k++ ) a[k] = sin( k ); } int main(void) { clock_t starttime = clock(); for( int i = 0; i < 100000; i++ ) sub1(); clock_t endtime = clock(); cout << "Zeit: " << endtime-starttime << endl; return 0; } Die C++ Version benötigt 2500ms, wie ihr seht, ist Blitzbasic also schon ganz schön flott! ![]() Beste Grüße - Xaron |
||
Cerberus X - Monkey X Reloaded! |
Hot-BitSieger des B2D Retro Wettbewerb / Aug 04 |
![]() Antworten mit Zitat ![]() |
|
---|---|---|
Hi.
Vielleicht könntest du mal Functionen aufrufen, wobei du mehrere Werte übergibst, und dann teste noch einmal. Der Unterschied von GOSUB und Function() wurde doch schon erklärt ! Und: Hoch lebe GOTO ! Wie springt man ein Label an ? Ich verstehe die ganze Diskussion darüber überhaupt nicht. Toni |
||
... ..... .i.. ...
*** Sieger des BB-Gameboy-Contest 2004 Sieger des Blitzbaster 2D-Minigolf-Contest 2005 *** |
![]() |
Xaron |
![]() Antworten mit Zitat ![]() |
---|---|---|
Hi,
ich habe jetzt mal einen Funktionsaufruf eingebaut, der 2 Integer und einen String übergeben bekommt und einen Wert zurückgibt. Es ändert nichts. ![]() Wenn ich jetzt natürlich ein Objekt von etlichen kB Größe übergebe, wird's sicher langsamer. Da ist es schade, dass es kein call by reference bei Blitzbasic gibt, oder gibt es das doch? So ginge es ja nur über den Umweg eines Zugriffs über globale Variablen. Der Unterschied zwischen Gosub und Function wurde schon erklärt, aber wenn ich in einigen Tutorials lese, dass Functions wesentlich langsamer sind, kann ich das nicht so stehen lassen. ![]() Gruß - Xaron |
||
Cerberus X - Monkey X Reloaded! |
![]() |
BladeRunnerModerator |
![]() Antworten mit Zitat ![]() |
---|---|---|
Es ist wie so oft- Halbwahrheiten halten sich einfach länger ![]() Ich benutze scon von Beginn an Funktionen, da ich als Cevi-geschädigter jahrelang nur mit Goto/gosub arbeiten konnte. Da war BB mit seinen Funcs eine wahrhaftige Offenbahrung. Ich kann es eigent auch jedem nur raten. Und wer wirklich was sehr zeitkritisches haben sollte - ein testweiser Umbau in der Optimierungsphase sollte sicher aussagekräftig genug sein. ...mir wär aber noch kein so dringendes Speedproblem untergekommen welches sich durch anderweitige Optimierungen nicht besser hätte lösen lassen. Viva la Function! (für Bmaxler: Hoch leben Typefuncs ![]() EWG |
||
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 |
hitokiri |
![]() Antworten mit Zitat ![]() |
|
---|---|---|
Was nun vom jeweiligen Programmierer verwendet wird ist doch lediglich Präferenzfrage. Als Qbasler "vermiss" ich keine Funks sondern finde gosub auch hübsch. Und: Bei sehr grossen Funks wird man den Unterschied wohl schon merken aber in die Bereiche, dass es wirklich auffällt wird es bei mir wohl auch nie kommen.
Um mal mein Assemblerbuch zu zitieren: "Es gibt keine Regel, wann man Makros und wann man Subprozesse verwenden sollte, es obliegt dem Programmierer" |
||
Übersicht


Powered by phpBB © 2001 - 2006, phpBB Group