msgbox dynamisch erweitern

naja, Nachteil ist die Verwendung vom Datentyp Variant, speicherfressend (im Vergleich zu anderen Datentypen) und der Zugriff auf den Datentyp indirekt ist, so dass erst überprüft wird, welchen Typ er den nun hat.
Dadurch dauert der Zugriff auf das Array länger, als bei der Typdeklaration.
Aha, und in welchen Größenordnungen liegen diese Zugriffszeiten? Wohl eher im Nanosekundenbereich. Das ist in der Regel völlig zu vernachlässigen, da sollte man sich lieber auf die Korrektheit und Klarheit des Algorithmus konzentrieren und nicht auf solche Nebensächlichkeiten achten.

Tony Hoare hat gesagt.:
We should forget about small efficiencies, say about 97% of the time:

premature optimization is the root of all evil.

Ein wirkliches Argument für die Verwendung von For Each liefert Dein Link auch nicht wirklich, zumindest erkenne ich ihn nicht.
Der Vorteil ist, das es einfach ist und klar aussagt was es tut: es führt für jedes Element von dem Array die Anweisungen in der Schleife aus. Getreu dem KISS Prinzip

Gruß
 
Hi,

ein Array vom Typ Variant braucht beim Hinzufügen von 10000 Einträgen 1,91 ms auf meinem Rechner.
Ein Array vom Typ Long (per For i = 0) braucht 0,99 ms.

Visual Basic:
Sub main()
    
    
    Dim lngArray()  As Long
    Dim i As Long
    Dim v() As Variant
    Dim vone As Variant
    
    Set mTimer = New clsTimer
    
    mTimer.Calibrieren
    mTimer.Start
    'ReDim lngArray(10000)
'    For i = 0 To 10000
'        lngArray(i) = i
'    Next i

    ReDim v(10000)
    For Each vone In v
        i = i + 1
        vone = i
    Next vone
    
    mTimer.Halt
    Debug.Print Format(mTimer.RunTime, "0.00 ms")
End Sub
 
Hi.
Hi,

ein Array vom Typ Variant braucht beim Hinzufügen von 10000 Einträgen 1,91 ms auf meinem Rechner.
Ein Array vom Typ Long (per For i = 0) braucht 0,99 ms.
Mal abgesehen, das du nicht gesagt hast wie du getestet hast und wie akkurat der Timer ist den du da benutzt hast, heißt das wohl, dass man die Unterschiede in der Laufzeit ruhig vernachlässigen kann. Wenn ein Programm langsam läuft, dann wohl nicht weil man statt einer Zählschleife eine For Each Schleife benutzt hat.

Bevor man irgendwas am Code optimiert, sollte man erstmal feststellen wo der Flaschenhals liegt. Wie schon gesagt: premature optimization is the root of all evil.

Gruß
 
Hi,

naja, der Code zeigt Dir, wie ich getestet habe.
Der Timer läuft mit einer Genauigkeit von 0,00083 ms.

Ich denke, es hängt einfach vom Anwendungsfall ab, ob man "Each" oder "For i" verwendet.
 
Hi.
naja, der Code zeigt Dir, wie ich getestet habe.
Ich meinte wie oft du das Programm hast laufen lassen um zu einem verläßlichen Wert zu kommen und mit welchen Einstellungen du kompiliert hast etc.

Der Timer läuft mit einer Genauigkeit von 0,00083 ms.
Du verwechselst das nich zufällig mit der Präzision? Welche API Funktion wird denn da verwendet? GetTickCount? Der hat nur eine Genauigkeit von 12-58 ms.

Ich denke, es hängt einfach vom Anwendungsfall ab, ob man "Each" oder "For i" verwendet.
Da stimme ich dir zu.

Gruß
 
Hi,

folgende Klasse wurde als Timer verwendet:
Visual Basic:
Option Explicit

'Deklaration: Globale Klassen API-Typen
Private Type LARGE_INTEGER
    Lo As Long
    Hi As Long
End Type

'Deklaration: Globale Klassen API-Funktionen
Private Declare Function QueryPerformanceCounter Lib "kernel32" ( _
    lpPerformanceCount As LARGE_INTEGER) As Long

Private Declare Function QueryPerformanceFrequency Lib "kernel32" ( _
    lpFrequency As LARGE_INTEGER) As Long

'Deklaration: Globale Klassen-Variablen
Dim dblCalibrieren As Double

Dim udtStart As LARGE_INTEGER
Dim udtEnde As LARGE_INTEGER
Dim udtFreq As LARGE_INTEGER

Public Sub Calibrieren()
    Call QueryPerformanceCounter(udtStart)
    Call QueryPerformanceCounter(udtEnde)

    dblCalibrieren = (D(udtEnde) - D(udtStart)) / D(udtFreq) * 1000
End Sub

Private Sub Class_Initialize()
    Call QueryPerformanceFrequency(udtFreq)
End Sub

Public Sub Halt()
    Call QueryPerformanceCounter(udtEnde)
End Sub

Public Sub Start()
    Call QueryPerformanceCounter(udtStart)
End Sub

Public Property Get RunTime() As Double
    RunTime = (D(udtEnde) - D(udtStart)) / D(udtFreq) * 1000 -  _
    dblCalibrieren
End Property

Private Function D(udtX As LARGE_INTEGER) As Double
    'Deklaration: Lokale Prozedur-Variablen
    Dim dblHigh As Double
    Dim dblLow As Double

    dblLow = udtX.Lo
    dblHigh = udtX.Hi

    If dblLow < 0 Then
        dblLow = 4294967296# + dblLow + 1
    End If

    If dblHigh < 0 Then
        dblHigh = 4294967296# + dblHigh + 1
    End If

    D = dblLow + dblHigh * 4294967296#
End Function
 
Hi.

Also QueryPerformanceCounter ist tatsächlich ziemlich akkurat. Allerdings kann es vorkommen, das der Counter unangekündigt während der Zeitmessung korrigiert wird was zu einem ungenauen Ergebnis führt.

Gruß
 

Neue Beiträge

Zurück