Laufzeit eines Makros II (VBA)

Hallo Experten,

ich habe ebenfalls eine Frage zum Thema Laufzeit. Es geht um den Zugriff auf einzelne Bytes einer Datei.

Bei Variante 1 lese ich außerhalb des zeitkritischen Teiles den gesamten Dateiinhalt in einen String ein und isoliere das gewünschte Byte per MID-Funktion, bei Variante 2 greife ich gezielt auf das jeweilige Byte der Datei zu (mittels Binary Access Read und Get; für jedes Byte wird der Kanal geöffnet und nach dem Zugriff wieder geschlossen).

Ich hatte erwartet dass der speicherinterne Zugriff schneller ist als der Zugriff auf die HDD - dem ist aber nicht so. Schon bei 1000 Bytes ist Variante 2 merklich schneller.

Warum das? Danke schon mal.
Martin

Hallo Martin,

Ich hatte erwartet dass der speicherinterne Zugriff schneller
ist als der Zugriff auf die HDD

ich auch.

  • dem ist aber nicht so. Schon
    bei 1000 Bytes ist Variante 2 merklich schneller.

*staun* zeige mal bitte beide Codes, danke.

Gruß
Reinhard

Hallo Reinhard, altes Haus :wink: ,

jetzt habe ich den relevanten Code mal ohne den ganzen überflüssigen Kladderadatsch laufen lassen und siehe da - die Welt war wieder i.O.

Dann muss ich wohl mal den „Kladderadatsch“ unter die Lupe nehmen.

Danke und schönen Abend noch.
Martin

Sehr absonderlich - jetzt lässt sich das Fänomehn nicht mal mehr reproduzieren… Kratzkratz

Ich weiß leider nicht genau, wie VBA auf die Daten zugreift, aber der Effekt ist mir schon öfter massiv aufgefallen. Das heißt, dass Microsoft hier einfach gute Arbeit beim Dateizugriff geleistet hat. Vermutlich wird auf Dateiebene tatsächlich direkt auf Byte xxx gesprungen und nicht erst alles davor komplett eingelesen.

Das Schreiben in einen normalen String ist übrigens ohnehin recht langsam - gerade bei „größeren“ Datenmengen. Im Falle von VBA.net wäre mal eine dritte Variante über den StringBuilder zu prüfen - wenn es unbedingt im Arbeitsspeicher sein muss/soll.

Der StringBuilder baut größere String deutlich schneller auf. Bei 5-10 MB ist das wirklich deutlich spürbar.

Gruss,
Andi