Das erste, was ich erwähnen muss, ist, dass der .Net-Code niemals in einer VM ausgeführt wird. Auch wenn es stimmt, dass .Net-Programme in IL kompiliert werden, das sich in gewisser Weise mit Javas ByteCode vergleichen lässt, ist der wichtige Unterschied, dass die IL vor dem Start der App vollständig in nativen Code kompiliert wird, anstatt von einer VM interpretiert zu werden.
Über den .Net/VB6-Vergleich. Ich kann keine konkreten Daten angeben, aber aus persönlicher Erfahrung hängt es davon ab, was du tust.
Um das zu veranschaulichen, denken wir an sechs verschiedene Benchmark-Anwendungen, von denen jede eine VB6- und eine .Net-Version hat. Jede Anwendung führt eine spezifische Operation aus, wiederholt sie 100.000 Mal und zeichnet dann die benötigte Zeit auf. Beachte, dass dies ein Gedankenexperiment ist: Ich habe tatsächlich keine Ergebnisse aus echten Apps gesehen. Aber ich habe das Gefühl, die Stärken und Schwächen beider Plattformen zu kennen.
-
Anwendung A führt rechenintensive numerische Berechnungen durch. In diesem Fall würde ich vermuten, dass die Ergebnisse hier fast identisch sein werden. Sowohl VB6 als auch .Net werden in nativen Code kompiliert, sodass eine CPU-mult
-Anweisung auf beiden Plattformen gleich ist. Das gesagt, wenn du nicht Option Strict
verwendest, könntest du auf beiden Plattformen schnell in Schwierigkeiten geraten. Da du C# verwendet hast (was im Grunde genommen immer Option Strict
ist), könnte das deinem .Net-Code einen Vorteil verschaffen.
-
Anwendung B ruft einen Wert aus einer Datenbank ab. Auch hier sind die Ergebnisse wahrscheinlich sehr ähnlich, aber ich würde .Net einen sehr leichten Vorteil geben, aus zwei Gründen: Es verwendet einen nativen SQL-Client, der angeblich etwas schneller ist, und es führt automatische Verbindungspooling durch und erleichtert das Auslagern von Dingen wie einmaligem Herstellen einer Verbindung und Wiederverwenden dieser Verbindung anstelle von wiederholtem Verbinden. Aber wenn du Äpfel mit Äpfeln vergleichst, was den Code betrifft, werden die beiden wahrscheinlich sehr nah beieinander liegen.
-
Anwendung C zeigt und versteckt ein Formular wiederholt. Hier müsste ich VB6 den Vorzug geben. Es basiert auf einem älteren, weniger glanzvollen Widget-Set, das billiger zu rendern sein wird. Außerdem sind die WinForms-Komponenten nicht gerade für ihre Geschwindigkeit bekannt. Allerdings ist der Unterschied wahrscheinlich nicht so groß, wie du denkst, und du wirst wahrscheinlich nicht so oft Formulare vollständig neu zeichnen. Dies ist wahrscheinlich die Langsamkeit, über die sich Ihre Benutzer beschweren.
-
Anwendung D basiert auf Zeichenkettenoperationen, und hier muss ich .Net den Vorzug geben. Sowohl VB6 als auch .Net sind für langsame Zeichenkettenoperationen bekannt. Jedoch bietet .Net eine Reihe von Tools, die in VB6 einfach nicht verfügbar sind, um Entwicklern zu helfen, die Langsamkeit zu überwinden. Das gesagt, wenn du diese Tools nicht kennst, könnten schlechte Zeichenketten-Operationen deine App leicht verlangsamen. Auch dies trägt wahrscheinlich zu Benutzerbeschwerden bei.
-
Anwendung E wird wiederholt ein XML-Dokument in den Speicher laden. Auch hier denke ich, dass .Net einen Vorteil hätte. Erstens waren die xml-Tools, die für VB verfügbar waren, höchstens primitiv. Ich finde es unwahrscheinlich, dass sie nicht erheblich verbessert wurden. Außerdem ist der Garbage Collector von .Net ziemlich intelligent, was ihm einen Vorteil bei der Zuweisung und Freigabe von Speicher während der Ladevorgänge verschafft. Allerdings denke ich, dass die größte Rolle hier die Geschwindigkeit der Festplatte spielen wird, was bedeutet, dass der Unterschied nicht so groß sein würde.
-
Anwendung F wird wiederholt ein .Net- oder VB6-Programm starten, auf dessen Bereitschaft warten (für eine gewisse Definition von "bereit") und dann schließen. Hier hat VB6 wahrscheinlich den Vorteil aus zwei Gründen. Erstens muss das .Net die IL beim ersten Start in Bytecode kompilieren. Glücklicherweise gilt das nur für den ersten Lauf. Zweitens muss die .Net-App auch alle referenzierten Assemblys laden. Im Vergleich dazu ist die VB6-Runtime viel kleiner. Dies trifft jedoch normalerweise nur beim ersten Start der App auf einer bestimmten Maschine zu, und es gibt Möglichkeiten, den .Net-Code vorab zu kompilieren. Dies kann auch zur wahrgenommenen Langsamkeit beitragen.
Ein wichtiger Punkt ist, dass die .Net-App für all diese Anwendungen wahrscheinlich einen viel größeren Speicherbedarf haben wird. Aus irgendeinem Grund neigen Entwickler dazu, dies als eine schlechte Leistungseigenschaft zu betrachten, wenn in Wirklichkeit das Gegenteil der Fall ist. Wenn deine App mehr Speicher verwendet, verbringt sie wahrscheinlich weniger Zeit beim Zugriff auf die Festplatte, und die Festplatte ist bei weitem langsamer. Es wird wahrscheinlich auch mehr zwischengespeichert, was die CPU-Zeit spart. Und speziell für .Net spart es Zuweisungs-/Freigabeoperationen für Zeiten, in denen sie wichtiger sind oder wenn der PC sonst unbenutzt ist.
Ich habe keine Zeit, aber es wäre interessant zu sehen, wie jemand die in Coding Horror des heutigen Tages erwähnte StopWatch-Implementierung (zumindest für die .Net-Seite) verwendet, um echte Benchmarks für jede dieser Anwendungen zu erhalten.