HERBERS Excel-Forum - das Archiv

Thema: Laufzeitunterschiede Application vs Worksheetfunction

Laufzeitunterschiede Application vs Worksheetfunction
daniel
Hallo

mal ne Frage für die Experten.

mache Funktionen wie bsp MIN und MAX kann man in VBA über Application.MAX verwenden oder aber auch über Worksheetfunction.MAX
dabei scheint es so zu sein, dass Worksheetfunction etwas schneller verarbeitet wird als Application.

Warum ist das so?

hier mal der Code, mit dem ich getestet habe, ausgabe im Direktfenster

Sub test()

Dim t As Double
Dim i As Long
Dim Z As Long

Dim a As single, b As Single, e As Single

a = Timer
b = Timer

Z = 10 ^ 5

t = Timer
For i = 1 To Z
e = Application.Min(a, b)
Next
Debug.Print Timer - t,

t = Timer
For i = 1 To Z
e = WorksheetFunction.Min(a, b)
Next
Debug.Print Timer - t

End Sub


Gruß Daniel
Das liegt daran,...
Case
Moin, :-)

… dass bei WorksheetFunction direkt auf die Excelfunktionen zugegriffen wird. Passt es nicht, wird ein Laufzeitfehler ausgegeben. Du hast also weniger zusätzlichen Aufwand.

Den hast du bei Application, denn hier werden noch Methoden und Eigenschaften zur Verfügung gestellt. Es gibt also mehr Verarbeitung, um z. B. Fehlerwerte zurückzugeben (statt Laufzeitfehler zu werfen) und verschiedene Datentypen zu handhaben. Das ist aber auch gleich der Vorteil - du kannst den Fehler direkt abfangen und behandeln.

Der Geschwindigkeitsunterschied dürfte marginal sein und mit Application bist du IMHO flexibler.

Servus
Case
AW: Laufzeitunterschiede Application vs Worksheetfunction
Der Steuerfuzzi
Hallo,

wenn es um Min und MAX geht, ist es mit VBA-Funktionen wahrscheinlich noch wesentlich schneller, z. B. so:
IIf(a < b, a, b)


Grüße
Michael
AW: Laufzeitunterschiede Application vs Worksheetfunction
Yal
Hmm...

Eigentlich ist WorksheetFunction ein Unter-Objekt von Application. Ich habe die 2 Fälle mit einem dritten ergänzt: Application.WorksheetFunction.Min
Diese letztere ist langsamer als WorksheetFunction.Min allein, wenn auch nur geringfügig.

Es scheint so zu sein, als ob der Aufruf einer Methode oder Unterobjekt durch das obere Objekt mehr Zeit braucht, als direkt. Also irgendeine "Overhead"-Aufgabe, die Zeit frisst. Ein Sprung vom Objekt zum Unter-unter-Objekt, wie bei Application.Min scheint wegen den fehlende Zwischenteil viel "Zuordnungsarbeit" zu haben.

Bei 10^6 Aufrufe:
WorksheetFunction.Min(a, b) --> 2,08 sek
Application.WorksheetFunction.Min(a, b) --> 2,33 sek
Application.Min(a, b) --> 3,57 sek

WorksheetFunction kann direkt gerufen werden. Was nicht der Fall von alle Unterobjekt ist.

VG
Yal
AW: Laufzeitunterschiede Application vs Worksheetfunction
daniel
du hast den Code, du kannst es testen.
bei mir ist das langsamer.

IIF hat außerdem den Nachteil, dass es, wenn da nicht nur einfache Werte drin stehen sondern auch Formeln und Funktionen, immer beide Teile berechnet, unabhängig von der vorausgehenden Prüfung. Das ist nicht gut für die Laufzeit und macht IIF auch ungeeignet, wenn man Fehler vermeiden will, denn iif(true, 1,1/0) gibt dir trotzdem den #Div/0-Fehler aus

aber darum ging es hier ja nicht.
AW: Laufzeitunterschiede Application vs Worksheetfunction
Der Steuerfuzzi
Hallo Daniel,

habe es mal kurz getestet, das IIf ist um Faktor 10 schneller als Worksheetfunction.Min.

Dass Berechnungen in beiden Zweigen durchgeführt werden dürfte von der Laufzeit eher untergeordnet sein. Und Fehler aufgrund unplausibler Daten sollte man sowieso von vorneherein vermeiden (also z. B durch 0 teilen).

Noch schneller ist es mit Case Select ... nochmal ca. Faktor 10 schneller als IIf:
    Select Case (a < b)

Case True
e = a
Case Else
e = b
End Select


Gruß
Michael
AW: Laufzeitunterschiede Application vs Worksheetfunction
daniel
du müsstest auch gegen das normale IF THEN ELSE testen.
alternativ gibts ja auch noch das:

e = a

if a < b Then e = b


aber meine Frage ging ja um den Unterschied zwischen Application und Worksheetfunction, also brauchen wir hier nicht über die IFs streiten.
AW: Laufzeitunterschiede Application vs Worksheetfunction
daniel
Und Fehler aufgrund unplausibler Daten sollte man sowieso von vorneherein vermeiden

dafür nimmt das normale IF

IIF nutze ich eigentlich eher gestalterisch, dh denn der Code dadurch übersichtlich wird, bspw wenn man mehrere solche IF-Abfragen untereinander hat, die dann einen schönen Block bilden.
Im Anhang ist...
Case
Moin Michael, :-)

... mein Testmakro (auch wenn das nicht die Frage war): ;-)
https://www.herber.de/bbs/user/178556.xlsb

Und es ist so - Select Case... ist da sehr schnell - auch wenn es ja nach System und CPU-Last immer unterschiedlich ausfallen wird. ;-)

Servus
Case
Wenn man kurze...
Case
Moin Michael, :-)

... Codesequenzfolgen testen möchte geht der Timer nicht mehr. Hier greift man z. B. auf die API-Funktion "QueryPerformanceCounter" zurück: ;-)
https://learn.microsoft.com/en-us/windows/win32/api/profileapi/nf-profileapi-queryperformancecounter

Im Anhang sind beide Möglichkeiten drin: ;-)
https://www.herber.de/bbs/user/178558.xlsb

Servus
Case
kurz und elegant ist nicht immer schnell owt.
daniel
Sehe ich auch so. Auch o.w.T... :-)
Case
;-)
AW: Das liegt daran,...
SeppAllroad
Danke für die schnelle Antwort.

Da mehrere Personen (bis zu 20) auf die Datei zugreifen (von unterschiedlichen PC’s). Bei manchen geht es nicht, bei anderen schon.
Alle gleiche Firma, die Datei liegt auf einem Netzwerklaufwerk.

Und bei mir ging es vor 2 Monaten auch noch. Müsste allerdings noch mal testen wie die Datei sich an einem anderen Rechner verhält.