Beeinflussen Leerzeichen und Kommentare im VBA-Code die Leistung?

1756
Coding Enthusiast

Ich bin neu in der VBA-Programmierung. Ich glaube, ich habe es irgendwo gesehen, aber ich habe völlig vergessen, wo ich es gesehen habe. Vielleicht habe ich es von jemandem gehört.

Meine Frage: Beeinflusst die Menge an Kommentaren und Leerzeichen in VBA die Leistung des Codes?

Ich denke, es sollte in Excel und Access gleich sein, aber ich möchte nicht davon ausgehen, dass ich Access 2003 benutze.

3
Haben Sie ein spezifisches Problem, bei dem Sie vermuten, dass dies die Ursache ist? CharlieRB vor 8 Jahren 0
Nicht wirklich, aber ich bin auf einen Artikel gestoßen, in dem Kommentare und Leerzeichen zwischen VBA in vba den Prozess verlangsamen. davon bin ich nicht ganz überzeugt. Coding Enthusiast vor 8 Jahren 0

5 Antworten auf die Frage

0
Karan

Leerzeichen und Kommentare werden im Allgemeinen von Compilern und Interpreten ignoriert. Ich kann es keine offizielle Erklärung zu diesem Zweck für VBA speziell (ähnlich finde diesen für C - Code in Visual Studio), aber aus experimentellen Tests scheint VBA die gleiche Art und Weise zu verhalten.

In Bezug auf die Menge an Code in VBA, die sich auf die Leistung einer Prozedur auswirkt, wird die Ausführung der Prozedur natürlich umso länger dauern, je länger der Code ist.

Einige Interpreter, z. B. solche, die zur Laufzeit interpretieren, müssen zur Laufzeit mit Leerzeichen umgehen. Dies ist zwar eine weitgehend unbedeutende Zeit, die mit dem Überspringen des weißen Bereichs verbracht wird, es dauert jedoch einige Zeit. Compiler tun, was Sie sagen. Eliptical View vor 8 Jahren 0
0
trigger

Aus MSDN MS-VBAL-Lexikalischen Regeln

Denken Sie auch daran, dass Variablen- und Konstantennamen in einem kompilierten Programm nicht vorhanden sind.

3.2.1 Grammatik der physischen Linien

module-body-physical-structure = *source-line [non-terminated-line] source-line = *non-line-termination-character line-terminator non-terminated-line = *non-line-termination-character line-terminator = (%x000D %x000A) / %x000D / %x000A / %x2028 / %x2029 non-line-termination-character = <any character other than %x000D / %x000A / %x2028 / %x2029> 

Eine Implementierung kann die Anzahl der Zeichen begrenzen, die in einer physischen Zeile zulässig sind. Die Bedeutung eines Moduls, das physikalische Zeilen enthält, die eine solche Implementierungsgrenze überschreiten, ist in dieser Spezifikation nicht definiert. Wenn eine <Modulkörper-physische-Struktur> mit einer <nicht terminierten Zeile> abschließt, KANN eine Implementierung das Modul so behandeln, als würde auf die <nicht terminierte Zeile> unmittelbar ein <Zeilenabschlusszeichen> folgen.

Zur Interpretation als VBA-Programmtext wird ein Modulkörper (Abschnitt 4.2) als ein Satz logischer Zeilen betrachtet, von denen jede mehreren physischen Zeilen entsprechen kann. Diese Struktur wird durch die logische Liniengrammatik beschrieben. Die Terminalsymbole dieser Grammatik sind Unicode-Zeichen-Codepunkte.

3.2.2 Logische Liniengrammatik

module-body-logical-structure = *extended-line extended-line = *(line-continuation / non-line-termination-character) line-terminator line-continuation = *WSC underscore *WSC line-terminator WSC = (tab-character / eom-character /space-character / DBCS-whitespace / most-Unicode-class-Zs) tab-character = %x0009 eom-character = %x0019 space-character = %x0020 underscore = %x005F DBCS-whitespace = %x3000 most-Unicode-class-Zs = <all members of Unicode class Zs which are not CP2-characters> 

Eine Implementierung kann die Anzahl der Zeichen in einer <erweiterten Zeile> begrenzen. Zur Vereinfachung der Spezifikation ist es zweckmäßig, sich explizit auf den Punkt beziehen zu können, der unmittelbar vor dem Beginn einer logischen Zeile und dem Punkt unmittelbar vor dem letzten Zeilenende einer logischen Zeile steht. Dies wird mit <LINE-START> und <LINE-END> als Terminalsymbol der VBA-Grammatiken erreicht. Ein <LINE-START> ist so definiert, dass er unmittelbar vor jeder logischen Zeile steht, und ein <LINE-END> wird als das Ersetzen des <Zeilenabschlusses> am Ende jeder logischen Zeile definiert:

module-body-lines = *logical-line logical-line = LINE-START *extended-line LINE-END 

Bei Verwendung in einer ABNF-Regeldefinition werden mit <LINE-START> und <LINE-END> der erforderliche Anfang oder das Ende einer <logischen Zeile> angegeben.

3.3 Lexikalische Token

Die Syntax von VBA-Programmen lässt sich am einfachsten anhand von lexikalischen Token und nicht anhand einzelner Unicode-Zeichen beschreiben. Insbesondere ist das Auftreten von Leerzeichen oder Zeilenfortsetzungen zwischen den meisten syntaktischen Elementen für die syntaktische Grammatik in der Regel irrelevant. Die syntaktische Grammatik wird wesentlich vereinfacht, wenn sie solche möglichen Whitespace-Vorkommnisse nicht beschreiben muss. Dies wird erreicht, indem lexikalische Token (auch einfach als Token bezeichnet) verwendet werden, die Leerzeichen als terminale Symbole der syntaktischen Grammatik abstrahieren. Die lexikalische Grammatik definiert die Interpretation einer <Modulkörperlinien> als eine Menge solcher lexikalischer Token.

Die Terminalelemente der lexikalischen Grammatik sind Unicode-Zeichen und die Elemente <LINE-START> und <LINE-END>. Im Allgemeinen ist jeder Regelname der lexikalischen Grammatik, der in Großbuchstaben geschrieben wird, auch ein lexikalisches Token und ein terminales Element der VBA-Syntaxgrammatik. Von ABNF zitierte wörtliche Textregeln gelten auch als lexikalische Token der syntaktischen Grammatik. Lexikalische Token umfassen alle Leerzeichen, die unmittelbar vor ihnen stehen. Beachten Sie, dass bei der Verwendung in der lexikalischen Grammatik zitierte Regeln für literalen Text nicht als Token behandelt werden. Daher sind alle vorangestellten Whitespace-Zeichen von Bedeutung.

3.3.1 Separator- und Spezial-Token

WS = 1*(WSC / line-continuation) special-token = "," / "." / "!" / "#" / "&" / "(" / ")" / "*" / "+" / "-" / "/" / ":" / ";" / "<" / "=" / ">" / "?" / "\" / "^" NO-WS = <no whitespace characters allowed here> NO-LINE-CONTINUATION = <a line-continuation is not allowed here> EOL = [WS] LINE-END / single-quote comment-body EOS = *(EOL / ":") ;End Of Statement single-quote = %x0027 ; ' comment-body = *(line-continuation / non-line-termination-character) LINE-END 

<special-token> wird verwendet, um einzelne Zeichen zu identifizieren, die in der Syntax von VBA-Programmen eine besondere Bedeutung haben. Da es sich um lexikalische Token (Abschnitt 3.3) handelt, können diesen Zeichen Leerzeichen vorangestellt werden, die ignoriert werden. Jedes Vorkommen eines der zitierten <special-token> -Elemente als Grammatikelement innerhalb der syntaktischen Grammatik ist ein Verweis auf das entsprechende Token (Abschnitt 3.3).

<NO-WS> wird als terminales Element der syntaktischen Grammatik verwendet, um anzuzeigen, dass dem Token, das unmittelbar folgt, keine Leerzeichen vorangestellt werden dürfen. <NO-LINE-CONTINUATION> wird als terminales Element der syntaktischen Grammatik verwendet, um anzuzeigen, dass dem Token, das unmittelbar darauf folgt, kein Leerzeichen vorangestellt werden darf, das beliebige <Zeilenfortsetzungssequenzen> enthält.

<WS> wird als terminales Element der syntaktischen Grammatik verwendet, um anzuzeigen, dass dem unmittelbar darauf folgenden Token ein oder mehrere Leerzeichen vorangestellt sein müssen.

<EOL> wird als Element der syntaktischen Grammatik verwendet, um das Token zu benennen, das als "Ende der Anweisung" -Markierung für Anweisungen fungiert, die die einzige oder letzte Anweisung in einer logischen Zeile sein müssen.

<EOS> wird als terminales Element der syntaktischen Grammatik verwendet, um das Token zu benennen, das als "Ende der Anweisung" -Markierung fungiert. Im Allgemeinen ist das Ende der Anweisung entweder durch ein <LINE-END> oder ein Doppelpunkt gekennzeichnet. Alle Zeichen zwischen einem <einfachen Anführungszeichen> und einem <LINE-END> sind Kommentartext, der ignoriert wird.

Aber wie lautet die Schlussfolgerung zur Leistung? Arjan vor 8 Jahren 1
Die Frage ist VBA, so dass die kompilierte VB6 als VBA-Host wie Office enthalten ist, also KEINE LEISTUNGSMERKMALE AN ALLEN. Und notiere meinen Kommentar zu den Namen - sie werden wegkompiliert - sie existieren nicht in einem kompilierten Programm. Leerzeichen auch nicht. trigger vor 8 Jahren 0
0
Eliptical View

Möglicherweise stellen Sie fest, dass VBA zur Ausführungszeit in ausführbare Token zerlegt wird, nicht zur Laufzeit.

Mehrere Inline-Leerzeichen werden als ein einzelnes N-Leerzeichen-Token kompiliert, sodass sie zur Bearbeitung erneut angezeigt werden können. In Wirklichkeit handelt es sich jedoch nur um ein einzelnes Token im kompilierten Code. Es ist also egal, wie viele Leerzeichen Sie zwischen den Wörtern einfügen. 100 ist dasselbe wie 1.

Dieses "Nach Konstruieren korrigieren" entfernt also effektiv alle Leerzeichen, wenn Sie mit der Bearbeitung fertig sind (nicht beim Ausführen).

Versuch es selber. Fügen Sie ein paar zusätzliche Leerzeichen am Ende einer Zeile ein, wechseln Sie zur nächsten Zeile, gehen Sie dann zurück und die Leerzeichen sind verschwunden. Beachten Sie auch, dass, wenn Sie versuchen, ungültigen Code einzugeben, sich dies beschwert, bis Sie ihn korrigieren. Dies ist die Signatur für frühes Parsen und Tokenisieren.

Die Antwort auf Ihre Frage lautet also, dass beim Ausführen des Codes keine zusätzlichen Leerzeichen vorhanden sind, da der Code vorkompiliert ist und daher KEINE Geschwindigkeit bewirken kann.

Ich finde, Correct-by-construction ist wirklich ziemlich cooles Zeug. Es ist das Beste aus einem Laufzeit-Interpreter und einem schnellen Compiler in einem!

Der Parser in der Forth-Computersprache hat etwas Ähnliches getan, wie er funktioniert hat, aber natürlich hatte er vom Konstrukteur nicht die richtigen. Ich hatte immer gehofft, eins hinzuzufügen.

Ah, tatsächlich erinnere ich mich jetzt an das merkwürdige Verhalten seines Herausgebers. Aber zu * "Ich denke, dass Correct-by-construction wirklich ziemlich cooles Zeug ist" *: Ich erinnere mich nur, wie ärgerlich ich wäre, wenn Office das Zeug validieren und korrigieren und Kompilierfehler auf mich werfen würde, während ich noch tippte. :-) Arjan vor 8 Jahren 0
-1
user55570

In den meisten praktischen Situationen sollte dies keine Auswirkungen haben.

Sie sollten die Verwendung von Leerzeichen und Kommentaren nicht für die Leistung, sondern für die Lesbarkeit in Betracht ziehen.

Diese Antwort fügt keine zusätzlichen Informationen hinzu und sollte ein Kommentar sein. Raystafarian vor 8 Jahren 1
Haben die anderen Antworten etwas zur Lesbarkeit gesagt? user55570 vor 8 Jahren 0
-2
FreeMan

VBA ist eine interpretierte Sprache, was bedeutet, dass der Interpreter bei jeder Ausführung den gesamten vom Menschen lesbaren Code analysieren muss, im Gegensatz zu einer kompilierten Sprache, in der der vom Menschen lesbare Code einmal in maschinenlesbaren Code kompiliert wird. In beiden Fällen werden Leerzeichen und Kommentare vor der Ausführung entfernt.

Theoretisch könnten Sie genügend zusätzlichen Leerraum und / oder Kommentare in Ihren VBA-Code einfügen, um den Interpreter zu verlangsamen, aber Sie müssten wahrscheinlich Tausende oder Zehntausende von Zeilen zusätzlichen Junk haben, um einen Unterschied zu bemerken .

Es wäre jedoch ein interessantes Experiment!

Zufälliges Down-vote ... Warum erklären? FreeMan vor 8 Jahren 0
Es scheint, dass jede einzelne Antwort (auch eine gelöschte) einen Downvote erhielt. Raystafarian vor 8 Jahren 0
Wenn Sie in die richtige Richtung gehen, ist das, was Sie sagen, einfach nicht wahr: "Dies bedeutet, dass der Interpreter bei jedem Lauf den gesamten von Ihnen lesbaren Code analysieren muss." Eliptical View vor 8 Jahren 0