Re: Code Optimierung
- From: Stefan Ruppel <StefanRuppel@xxxxxxxxxxxxxxxxxxxxxxxxx>
- Date: Fri, 25 Sep 2009 06:58:01 -0700
"Stefan Ruppel" wrote:
"Sascha Trowitzsch" wrote:
Hi Stefan,Für den Test habe ich mit folgendem Code gearbeitet und auf einem HP Core2
Stefan Ruppel wrote:
Ganz herzlichen Dank für alle Zuschriften. Habe das jetzt doch 'mal
getestet mit doch etwas überraschenden Ergebnissen:
Bei mir geht es um eine Funktion die auf mehrere 10.000 Datensätze
(das können aber auch 'mal 100.000 sein) u.U. mehrfach angewendet
wird, aber mehr als 500.000 Funktionsaufrufe hatte ich in einem Lauf
bisher noch nie. Dabei werden bei jedem Funktionsaufruf 22 Variablen
benötigt. Der Aufruf der Funktion erfolgt ausschließlich im Rahmen
von SQL Statements. Die fertigen Auswertungen werden dann in Excel
weiterverarbeitet.
HAbe das jetzt in 2 Varianten getestet ("nackert" - ohne die
eigentliche Funktion):
- Einrichten von 22 Public Variablen auf Modulebene + Initialisierung
bei jedem Funktionsaufruf mit "0" innerhalb der Funktion und
- 22 Variablen bei jedem Funktionsaufruf neu initialisiert (nur lokal)
ERgebnis: Bei 10.000 Aufrufen tut sich da gar nichts!
Bei 100.000.000 Aufrufen ist das Ergebnis so:
Variante 1 (Public Var) dauert 40 Sek und
Variante 2 (Lokale Variablen) dauerte nur 13 Sek
Fazit:
Lokal ist deutlich schneller, aber für mein Problem ist der Zeitfaktor
daraus i.d.R. vernachläßigbar.
Ich hätte oben nicht hingeschrieben, dass es performancemäßig egal ist, ob
globale oder lokale Variablen deklariert und bestückt werden, wenn ich es
zuvor nicht sicherheitshalber ebenfalls in einem kleinen Test nachgeprüft
hätte.
Und deine Ergebnisse kann ich in keiner Weise nachvollziehen - bei mir kommt
dasselbe raus. Code unten angehängt.
Deshalb muss man schon nachfragen, wie deine Funktionen aussehen und von
welcher Art Variablen du überhaupt sprichst. Es ist etwa nicht egal, ob da
Longs zum Einsatz kommen, oder Objektvariablen.
Und die Funktionsperformance über Abfragen zu testen, wenn ich es richtig
verstanen habe, ist auch nicht gerade das optimale Szenario, weil JET bei
jeder Abfrage vor einer neuen Situation steht.
Versteh ich ich also alles nicht so recht...
Ciao, Sascha
------------------------------------
Testmodul:
Option Compare Database
Option Explicit
Dim a As Long
Dim b As Long
Dim c As Long
Dim d As Long
Dim e As Long
Sub TestAll()
Dim i As Long
Dim T As Single
T = VBA.Timer
For i = 1 To 100000000
TestLoc
Next i
Debug.Print (Timer - T)
T = VBA.Timer
For i = 1 To 100000000
TestGlob
Next i
Debug.Print (Timer - T)
End Sub
Sub TestLoc()
Dim aa As Long
Dim bb As Long
Dim cc As Long
Dim dd As Long
Dim ee As Long
aa = 1 + 1
bb = 1 + 2
cc = 1 + 3
dd = 1 + 4
ee = 1 + 5
End Sub
Sub TestGlob()
a = 1 + 1
b = 1 + 2
c = 1 + 3
d = 1 + 4
e = 1 + 5
End Sub
(gerade nochmal) die o.g. Ergebnisse erhalten.
Werde Deinen Code nochmal bei mir laufen lassen - interessiert mich doch.
Aber selbst wenn tatsächlich gleich schnell ist das Umschreiben nicht
lohnend - weil definitiv kein Performance Gewinn.
Option Compare Database
Option Explicit
Public Mat_Adj As Double 'Maturity Adjustment - Hilfsvariable zur
Berechnung
'Dim Mat_adj2 As Double ' Zusätzliche variable wird benötigt für Double
default
Public b As Double 'Korrekturfaktor b für Maturity Adjustment
Public LN_PD As Double 'Natürlicher Logarythmus von PD - Probability
of Default -
'benötigt für Variable "B"
Public Prob999 As Double 'Wahrscheinlichkeitsfaktor
Public ProbPD As Double 'Wahrscheinlichkeit von PD
Public R As Double 'Variable "R" - Korrelationsfaktor
Public R_Faktor As Double 'Teilterm der Variable "R":
[1-e^(-K-PD)]/[1-e^(-K)]
Public WurzelR As Double 'Quadratwurzel von R
Public wurzel1R As Double 'Quadratwurzel von (1-R)
Public Totalloss As Double 'Total Loss
Public EL As Double 'Expected Loss
Public KMU_Abschlag As Double 'Abschlag vom Korrelationsfaktor für kleine
'und mittelere Unternehmen
Public RW As Double 'ermitteltes Risikogewicht - entspricht Faktor
'Risikogewicht nach Sicherheiten
Public DD_Adj As Double 'Double Default Adjustment
Public RW_DD As Double 'Risikogewicht "Double Default" Ansatz
Public RW_Sub As Double 'Risikogewicht Substitution Approach
Public Min_PD As Double 'Minimum PD von Subst/Kunde
Public M_2 As Double
'Zieldatum1 As Integer
'Dim info As String
Public A_Koeffiz As Integer 'Anstiegskoeffizient K
Public Min_Korr As Double 'Minimale Korrelation 0,12 Standard und 0,03
Public Max_Korr As Double 'Maximale Korrelation
Public Laufvariable 'Steuert die Form der Risikogewichtsrechnung
Sub test()
Dim I As Long
Dim time1, time2
time1 = Now
For I = 1 To 100000000
test1
Next I
time2 = Now
MsgBox ("time1: " & time1 & " und Time2: " & time2 & "/ Differenz: " &
Format(time2 - time1, "s"))
time1 = Now
For I = 1 To 100000000
test2
Next I
time2 = Now
MsgBox ("time1: " & time1 & " und Time2: " & time2 & "/ Differenz: " &
Format(time2 - time1, "s"))
End Sub
Sub test1()
Mat_Adj = 0 'Maturity Adjustment - Hilfsvariable zur Berechnung
b = 0 'Korrekturfaktor b für Maturity Adjustment
LN_PD = 0 'Natürlicher Logarythmus von PD - Probability of
Default -
'benötigt für Variable "B"
Prob999 = 0 'Wahrscheinlichkeitsfaktor
ProbPD = 0 'Wahrscheinlichkeit von PD
R = 0 'Variable "R" - Korrelationsfaktor
R_Faktor = 0 'Teilterm der Variable "R": [1-e^(-K-PD)]/[1-e^(-K)]
WurzelR = 0 'Quadratwurzel von R
wurzel1R = 0 'Quadratwurzel von (1-R)
Totalloss = 0 'Total Loss
EL = 0 'Expected Loss
KMU_Abschlag = 0 'Abschlag vom Korrelationsfaktor für kleine
'und mittelere Unternehmen
RW = 0 'ermitteltes Risikogewicht - entspricht unserem Faktor
'Risikogewicht nach Sicherheiten
DD_Adj = 0 'Double Default Adjustment
RW_DD = 0 'Risikogewicht "Double Default" Ansatz
RW_Sub = 0 'Risikogewicht Substitution Approach
Min_PD = 0 'Minimum PD von Subst/Kunde
M_2 = 0
'Zieldatum1 As Integer
'Dim info As String
A_Koeffiz = 0 'Anstiegskoeffizient K
Min_Korr = 0 'Minimale Korrelation 0,12 Standard und 0,03
Mengengeschäft
Max_Korr = 0 'Maximale Korrelation
Laufvariable = 0 'Steuert die Form der Risikogewichtsrechnung
End Sub
Sub test2()
Dim Mat_Adj As Double 'Maturity Adjustment - Hilfsvariable zur
Berechnung
'Dim Mat_adj2 As Double ' Zusätzliche variable wird benötigt für Double
default
Dim b As Double 'Korrekturfaktor b für Maturity Adjustment
Dim LN_PD As Double 'Natürlicher Logarythmus von PD - Probability of
Default -
'benötigt für Variable "B"
Dim Prob999 As Double 'Wahrscheinlichkeitsfaktor
Dim ProbPD As Double 'Wahrscheinlichkeit von PD
Dim R As Double 'Variable "R" - Korrelationsfaktor
Dim R_Faktor As Double 'Teilterm der Variable "R":
[1-e^(-K-PD)]/[1-e^(-K)]
Dim WurzelR As Double 'Quadratwurzel von R
Dim wurzel1R As Double 'Quadratwurzel von (1-R)
Dim Totalloss As Double 'Total Loss
Dim EL As Double 'Expected Loss
Dim KMU_Abschlag As Double 'Abschlag vom Korrelationsfaktor für kleine
'und mittelere Unternehmen
Dim RW As Double 'ermitteltes Risikogewicht - entspricht unserem
Faktor
'Risikogewicht nach Sicherheiten
Dim DD_Adj As Double 'Double Default Adjustment
Dim RW_DD As Double 'Risikogewicht "Double Default" Ansatz
Dim RW_Sub As Double 'Risikogewicht Substitution Approach
Dim Min_PD As Double 'Minimum PD von Subst/Kunde
Dim M_2 As Double
'Zieldatum1 As Integer
'Dim info As String
Dim A_Koeffiz As Integer 'Anstiegskoeffizient K
Dim Min_Korr As Double 'Minimale Korrelation 0,12 Standard und 0,03
Mengengeschäft
Dim Max_Korr As Double 'Maximale Korrelation
Dim Laufvariable 'Steuert die Form der Risikogewichtsrechnung
End Sub
Aber vieleicht hab' ich etwas falsch gemacht?
Gruß
Stefan Ruppel
Denke ich habe den Unterschied schon ich habe "Public" definiert und nicht
Dim - wußte nicht daß das auf Modulebene auch so geht. Ändert dann aber auch
nichts: Keine Änderung erforderlich.
Gruß Stefan Ruppel
.
- References:
- Code Optimierung
- From: Stefan Ruppel
- Re: Code Optimierung
- From: Thomas Möller
- Re: Code Optimierung
- From: Stefan Ruppel
- Re: Code Optimierung
- From: Sascha Trowitzsch
- Re: Code Optimierung
- From: Stefan Ruppel
- Code Optimierung
- Prev by Date: Re: Fehlermeldung: ODBC-Aufruf fehlgeschlagen
- Next by Date: Re: .accdb kein erkennbares Datenbankformat
- Previous by thread: Re: Code Optimierung
- Next by thread: Re: Code Optimierung
- Index(es):
Relevant Pages
|