Autor: Peter Haserodt  --- Aus Excel VBA - Gruppe: Tutorials

Performance (3) - Syntax Schnelligkeit

Autor: Peter Haserodt - Erstellt: --      - Letzte Revision: --Gruppenthema: 4 Folgen 1 2 3 4 Sie sind in Folge:3
Syntax Performance - Kann es das geben ?

Angestossen wurde ich durch einen Beitrag im Online-Excel Forum in welchem die Auslagerung in ein Klassenmodul hinterfragt wurde, da dies doch erheblich langsamer sei.

Vorab sei bemerkt, dass wir hier nicht von einmaligen Zugriffen reden, sondern in den Millionenbereich gehen, wo es wirklich spürbar wird (und auch da z.T. nur sehr gering)

Ich möchte Ihnen hier nur drei Beispiele geben.

Fangen wir mit einer Sache an, die wirklich interessant ist, nämlich dem Auslagern von Berechnungen.
Ich habe hier ein völlig blödsinnige Funktion erstellt aber sie sollte einiges zeigen.

Option Explicit

Private Declare Function GetTickCount Lib "kernel32" () As Long
	
Sub MachWas1()
	Dim i As Long, iStart As Long, iErgeb As Long
	iStart = GetTickCount
	For i = 1 To 10000000 ' Zehn Millionen
		iErgeb = RechnenAddieren(4, 5)
	Next i
	Debug.Print GetTickCount - iStart
End Sub
	
Sub MachWas2()
	Dim i As Long, iStart As Long, iErgeb As Long
	iStart = GetTickCount
	For i = 1 To 10000000 ' Zehn Millionen
		iErgeb = 4 + 5
	Next i
	Debug.Print GetTickCount - iStart
End Sub
	
Function RechnenAddieren(ByVal S1 As Integer, ByVal S2 As Integer) As Long
	RechnenAddieren = S1 + S2
End Function


Beide Sub's machen das Gleiche, nämlich Zehn Millionen Mal 4 + 5 zu berechnen, nur einmal direkt und das andere Mal über eine Funktion.
Das Ergebnis ist überraschend.


Quintessenz: Habe ich einen Code in welchem ich viele Male eine Berechnungsart benutze, sollte ich auf die Kapselung verzichten und es lieber in der Prozedur selbst machen (also auf die Auslagerung in eine Funktion verzichten).


If Then Else

Ich persönlich bevorzuge absolut

If Bedinung then
Aktion1
Else
Aktion2
End If

Tatsächlich ist aber

If Bedingung Then Aktion1 Else Aktion2
Fraktional schneller.



Kommen wir zu der von mir so verhassten Doppelpunkt Programmierung gerade im Bereich von If.

If Bedingung Then Aktion1 : Aktion2 : Aktion 3

Ist für mich ein Graus gegenüber:

If Bedingung Then
Aktion1
Aktion2
Aktion3
End If

Aber auch hier ist die erste Variante fraktional schneller.

Resultat:

Lesbarkeit von Code, Kapselung von Code ist anscheinend kontraproduktiv zur Performance.

Aber es ist sehr zu beurteilen, ob der Geschwindigkeitsvorteil den Salat rechtfertigt.

In einem Projekt, in welchem ich gekapselte Funktionen, lesbaren Code nur selten aufrufe, ist es sicherlich vernünftiger auf die Millionstel Sekunde zu verzichten.

Wenn ich aber Dinge in einer Häufigkeit durchlaufe, die in den spürbaren Bereich geht, dann muss ich mir Syntaxperformance versus Lesbarkeit überlegen.

Ich hoffe, ich konnte Sie auf das Problem aufmerksam machen und zu eigenen Experimenten veranlassen.




Weitere Artikel der Gruppe: Tutorials Aus Excel VBA
Nach oben