Prüfen ob Monat und Jahr gleich ist
#21
Hallo knobbi,

Zitat:Das kann mit der internen Speicherverwaltung von VBA zusammen hängen...
Da bin ich voll bei Dir Wink Mal noch zur Ergänzung zwei andere Testszenarien (Oben das entsprechend meinem gestrigen Beitrag nur zur "Einstimmung").

Code:
Sub TestIt()
  Dim Start As Double, Ziel As Double, i As Long, k As Long
  Dim arr As Variant
  arr = Cells(1).CurrentRegion.Value
  ' String-Array
  Dim astr() As String
  k = 0: Start = Timer
  ReDim astr(1 To UBound(arr), 1 To 2)
  For i = 1 To UBound(arr)
    astr(i, 1) = arr(i, 1): astr(i, 2) = arr(i, 2)
  Next
  For i = 1 To UBound(arr)
    If Mid$(astr(i, 1), 4) = Mid$(astr(i, 2), 4) Then k = k + 1
  Next
  Ziel = Timer
  Debug.Print "String-Vergleich (String):         " & Ziel - Start & vbTab & "Übereinstimmungen: " & k
End Sub

bringt bei mehrmaligem Ausführen dieses Subs
String-Vergleich (String): 0,583984375 Übereinstimmungen: 507212
String-Vergleich (String): 0,595703125 Übereinstimmungen: 507212
String-Vergleich (String): 0,599609375 Übereinstimmungen: 507212
String-Vergleich (String): 0,58984375 Übereinstimmungen: 507212

Code:
Sub TestIt_Call()
  Dim arr As Variant
  arr = Cells(1).CurrentRegion.Value
  StringVariant arr
  StringString arr
  StringString arr
  StringString arr
End Sub

Sub StringVariant(arr As Variant)
  Dim Start As Double, Ziel As Double, i As Long, k As Long
  ' Variant-Array mit Strings
  k = 0
  Start = Timer
  For i = 1 To UBound(arr)
    arr(i, 1) = FormatDateTime(arr(i, 1), vbShortDate)
    arr(i, 2) = FormatDateTime(arr(i, 2), vbShortDate)
  Next
  For i = 1 To UBound(arr)
    If Mid$(arr(i, 1), 4) = Mid$(arr(i, 2), 4) Then k = k + 1
  Next
  Ziel = Timer
  Debug.Print "String-Vergleich (Variant/String): " & Ziel - Start & vbTab & "Übereinstimmungen: " & k
End Sub

Sub StringString(arr As Variant)
  ' String-Array
  Dim astr() As String
  k = 0: Start = Timer
  ReDim astr(1 To UBound(arr), 1 To 2)
  For i = 1 To UBound(arr)
    astr(i, 1) = arr(i, 1): astr(i, 2) = arr(i, 2)
  Next
  For i = 1 To UBound(arr)
    If Mid$(astr(i, 1), 4) = Mid$(astr(i, 2), 4) Then k = k + 1
  Next
  Ziel = Timer
  Debug.Print "String-Vergleich (String):         " & Ziel - Start & vbTab & "Übereinstimmungen: " & k
End Sub

bringt bei mehrmaligem Durchlauf von (String) mit vorherigem (Variant/String) bei Aufruf aus einem übergeordneten Sub
String-Vergleich (Variant/String): 0,78515625 Übereinstimmungen: 507212
String-Vergleich (String): 0,4296875 Übereinstimmungen: 507212
String-Vergleich (String): 0,4101563 Übereinstimmungen: 507212
String-Vergleich (String): 0,4003906 Übereinstimmungen: 507212

Wobei ich das nun erwartet habe, da ja das übergeordnete Sub und entsprechend das Eine oder Andere noch im Speicher gehalten wird.


Ich habe nun mal komplett das Makro von Uwe in 6 Makros vereinzelt und bekomme das:
(oberer Teil zusammen, unterer Teil einzeln)

Monat dann Jahr-Vergleich: 0,27734375 Übereinstimmungen: 507212
Jahr dann Monat-Vergleich: 0,36328125 Übereinstimmungen: 507212
Monat und Jahr-Vergleich: 0,37890625 Übereinstimmungen: 507212
Format-Vergleich: 0,794921875 Übereinstimmungen: 507212
String-Vergleich (Variant/String): 0,796875 Übereinstimmungen: 507212
String-Vergleich (String): 0,376953125 Übereinstimmungen: 507212
********
Monat dann Jahr-Vergleich: 0,251953125 Übereinstimmungen: 507212
Jahr dann Monat-Vergleich: 0,328125 Übereinstimmungen: 507212
Monat und Jahr-Vergleich: 0,349609375 Übereinstimmungen: 507212
Format-Vergleich: 0,75 Übereinstimmungen: 507212
String-Vergleich (Variant/String): 0,6953125 Übereinstimmungen: 507212
String-Vergleich (String): 0,599609375 Übereinstimmungen: 507212

Der Datumsvergleich ist auf jeden Fall schneller. Der Vergleich (String), der sich im oberen Teil sogar minimal vor den Monat-Jahr-Vergleich schiebt, ist dann doch weiter weg, aber immer noch der schnellste von den zweiten 3 Varianten. Wink
.      \\\|///      Hoffe, geholfen zu haben.
       ( ô ô )      Grüße, André aus G in T  
  ooO-(_)-Ooo    (Excel 97-2019+365)
Antworten Top
#22
(04.08.2025, 07:20)schauan schrieb: Der Datumsvergleich ist auf jeden Fall schneller. Der Vergleich (String), der sich im oberen Teil sogar minimal vor den Monat-Jahr-Vergleich schiebt, ist dann doch weiter weg, aber immer noch der schnellste von den zweiten 3 Varianten. Wink

Mach den Test nochmal, halt die Finger stillt und dann nochmal und wackel ordentlich mit der Maus während der Code läuft. 
Dann vergleiche die Zeiten mit denen wo Du nicht mit der Maus gewackelt hast.

Andreas.
Antworten Top
#23
Hi,

ist schon verblüffend, wie wichtig ein Unterschied von 0,5s sein kann 20
Gruß

Edgar

Meine Antworten sind freiwillig und ohne Gewähr!
Über Rückmeldungen würde ich mich freuen.
Antworten Top
#24
(05.08.2025, 15:20)BoskoBiati schrieb: Hi,

ist schon verblüffend, wie wichtig ein Unterschied von 0,5s sein kann 20

naja, kommt immer darauf an.
in großen Projekten mit vielen Aufgaben summieren sich die Zeiten.
und für den Anwender mag es egal sein, wenn er mal kurz warten musst.
aber wenn du einen Code entwickelst und dabei nicht sofort auf die passende Lösung kommst, sondern dich mit viel Testen und Ausprobieren and die richtige Lösung herantasten musst (und das vielleicht noch unter Zeitdruck), dann bist du froh, wenn du beim Programmieren auf die Laufzeiten geachtet hast, denn solche Wartezeiten können dann viel Streß verursachen.
Antworten Top
#25
(05.08.2025, 15:28)slowboarder schrieb: in großen Projekten mit vielen Aufgaben summieren sich die Zeiten.

Kann sein, aber es in diesem Beispiel geht es bei 100000 Vergleichen um eine Größenordnung von ~0,5 Sek. bei minimalen Unterschieden.  
Ich würde, so wie Andreas das vorgeschlagen hat, schlichtweg mit den Datumsfunktionen und dem Monat / Jahr Vergleich arbeiten, weil das im Code sehr gut lesbar ist und nachvollziehbar ist. 

Bei großen Projekten würde ich dann schon mehr auf die Ressourcen schauen, das bringt m.E. mehr, als hier eine 1/10 Sek. herauszuholen. 

Gruß Knobbi38
Antworten Top
#26
(05.08.2025, 15:48)knobbi38 schrieb: Ich würde, so wie Andreas das vorgeschlagen hat, schlichtweg mit den Datumsfunktionen und dem Monat / Jahr Vergleich arbeiten, weil das im Code sehr gut lesbar ist und nachvollziehbar ist. 

Der ist gut, Ulrich. 21

Gruß, Uwe
Antworten Top
#27
@Edgar,

was macht man nicht alles, wenn man Zeit hat 15 100
.      \\\|///      Hoffe, geholfen zu haben.
       ( ô ô )      Grüße, André aus G in T  
  ooO-(_)-Ooo    (Excel 97-2019+365)
Antworten Top


Gehe zu:


Benutzer, die gerade dieses Thema anschauen: 1 Gast/Gäste