Folge dem Video um zu sehen, wie unsere Website als Web-App auf dem Startbildschirm installiert werden kann.
Anmerkung: Diese Funktion ist in einigen Browsern möglicherweise nicht verfügbar.
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.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.
Tony Hoare hat gesagt.:We should forget about small efficiencies, say about 97% of the time:
premature optimization is the root of all evil.
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 PrinzipEin wirkliches Argument für die Verwendung von For Each liefert Dein Link auch nicht wirklich, zumindest erkenne ich ihn nicht.
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
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.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.
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.naja, der Code zeigt Dir, wie ich getestet habe.
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.Der Timer läuft mit einer Genauigkeit von 0,00083 ms.
Da stimme ich dir zu.Ich denke, es hängt einfach vom Anwendungsfall ab, ob man "Each" oder "For i" verwendet.
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