AW: 1 oder n Array ?
18.11.2006 13:00:32
ingUR
Hallo, Ingo,
Deine Frage, die mich veranlaßte, eine einfache Zeitmessungsuntersuchung zu starten (korrigierte und erweiterte Routinen sie unten), die das zu erwartende Ergebnis liefert, dass das Suchen in Feldern von Typen-definierten Datensätzen länger dauert als das Suchen in einer Spalte eines mehrdimensionalen Feldes.
Jedoch erlangst Du damit m.E. eine bessere Übersicht und Wartungsmöglichkeit Deiner Daten, wenn Du mit typendefinierten Datensätzen arbeitest.
Es ist zu überlegen, ob das Sortieren selbst über ein Indexfeld - meistens sollte der Datenbereich einer Integervariablen ausreichen, entpr. 216/2-1 = 32767 bzw. Long, wenn mehr als die Hälfte aller möglichen Tabellenzeilen gefüllt sind - erfolgen sollte, zumal wenn du planst, die Zugriffsroutinen auf die Einträge generell zu verändern.
Gruß,
Uwe
Korrigierter und ergänzter Programmcode
Option Explicit
'Ausführungszeit mit diesen (Const-)Paramtern ca. 22 sek.
Const MAXITEMS = 20000
Const MAXRUNS = 100
Const SUCHWORT = "Anton"
Dim iM1(MAXITEMS) As Integer, sM2(MAXITEMS, 2) As String, dM3(MAXITEMS) As Date
Type Record
m1 As Integer
m2(2) As String
m3 As Date
End Type
Dim BigM(MAXITEMS) As Record
Dim StartZeit As Date, EndeZeit As Date
Sub Fill3Arrays()
Dim i As Long, s As Long, r As Long
Randomize
StartZeit = Time
For r = 1 To MAXRUNS
For i = 0 To MAXITEMS
iM1(i) = i
sM2(i, 1) = Chr(65 + Int(26 * Rnd)) & "elmann & i"
sM2(i, 2) = Chr(65 + Int(26 * Rnd)) & "enick" & Int(i * Rnd)
dM3(i) = Now - 500 * Rnd
Next i
Next r
EndeZeit = Time
sM2(MAXITEMS - 3, 2) = SUCHWORT
End Sub
Sub FillITEMSWith3M()
Dim i As Long, s As Integer, r As Long
StartZeit = Time
For r = 1 To MAXRUNS
For i = 0 To MAXITEMS
BigM(i).m1 = iM1(i)
For s = 1 To 2
BigM(i).m2(s) = sM2(i, s)
Next s
BigM(i).m3 = dM3(i)
Next i
Next r
EndeZeit = Time
End Sub
Sub Fill3MwithBigM()
Dim i As Long, s As Long, r As Long
StartZeit = Time
For r = 1 To MAXRUNS
For i = 0 To MAXITEMS
iM1(i) = BigM(i).m1
For s = 1 To 2
sM2(i, s) = BigM(i).m2(s)
Next s
dM3(i) = BigM(i).m3
Next i
Next r
EndeZeit = Time
End Sub
Sub FillRecsArray()
Dim i As Long, s As Long, r As Long
Randomize
StartZeit = Time
For r = 1 To MAXRUNS
For i = 0 To MAXITEMS
BigM(i).m1 = i
BigM(i).m2(1) = Chr(65 + Int(26 * Rnd)) & "elmann & i"
BigM(i).m2(2) = Chr(65 + Int(26 * Rnd)) & "enick" & Int(i * Rnd)
BigM(i).m3 = Now - 500 * Rnd
Next i
Next r
EndeZeit = Time
BigM(MAXITEMS - 3).m2(2) = SUCHWORT
End Sub
Sub SearchInBigM()
Dim i As Long, s As Long, r As Long, Index As Long
StartZeit = Time
For r = 1 To MAXRUNS
For i = 0 To MAXITEMS
If BigM(i).m2(2) = SUCHWORT Then Exit For
Next i
Index = i
Next r
EndeZeit = Time
End Sub
Sub SearchIn3M()
Dim i As Long, s As Long, r As Long, Index As LoadPictureConstants
StartZeit = Time
For r = 1 To MAXRUNS
For i = 0 To MAXITEMS
If sM2(i, 2) = SUCHWORT Then Exit For
Next i
Index = i
Next r
EndeZeit = Time
End Sub
Sub TimeCheck()
Dim strMsg(20) As String, totalMsg As String, maxStrLen As Integer
Dim z As Integer, maxZ As Integer, Zeit(20) As Variant
z = z + 1: maxZ = maxZ + 1
Fill3Arrays
strMsg(z) = "Füllen von drei Feldern"
maxStrLen = IIf(maxStrLen < Len(strMsg(z)), Len(strMsg(z)), maxStrLen)
Zeit(z) = EndeZeit - StartZeit
z = z + 1: maxZ = maxZ + 1
FillRecsArray
strMsg(z) = "Füllen von einem Type-Array"
maxStrLen = IIf(maxStrLen < Len(strMsg(z)), Len(strMsg(z)), maxStrLen)
Zeit(z) = EndeZeit - StartZeit
z = z + 1: maxZ = maxZ + 1
FillITEMSWith3M
strMsg(z) = "Füllen von einem Type-Array mit drei Arrays"
maxStrLen = IIf(maxStrLen < Len(strMsg(z)), Len(strMsg(z)), maxStrLen)
Zeit(z) = EndeZeit - StartZeit
z = z + 1: maxZ = maxZ + 1
Fill3MwithBigM
strMsg(z) = "Füllen von drei Arrays mit einem Type-Array"
maxStrLen = IIf(maxStrLen < Len(strMsg(z)), Len(strMsg(z)), maxStrLen)
Zeit(z) = EndeZeit - StartZeit
z = z + 1: maxZ = maxZ + 1
SearchInBigM
strMsg(z) = "Suchen in Type-Array"
maxStrLen = IIf(maxStrLen < Len(strMsg(z)), Len(strMsg(z)), maxStrLen)
Zeit(z) = EndeZeit - StartZeit
z = z + 1: maxZ = maxZ + 1
SearchIn3M
strMsg(z) = "Suchen in drei Arrays"
maxStrLen = IIf(maxStrLen < Len(strMsg(z)), Len(strMsg(z)), maxStrLen)
Zeit(z) = EndeZeit - StartZeit
For z = 1 To maxZ
totalMsg = totalMsg & vbLf & _
strMsg(z) & Space(maxStrLen + 5 - Len(strMsg(z))) & _
Format(Zeit(z), "hh:mm:ss")
Next
MsgBox totalMsg
End Sub