| |

VB.NET - FortgeschritteneRe: ContainsKey vs KeyNotFoundException abfangen | |  | Autor: Philipp15 | Datum: 19.12.08 23:37 |
| Hallo Ralf,
danke für die Idee, das selbst zu messen.
Ich habe folgendes probiert und dann mit System.Diagnostics.Stopwatch gemessen:
- Die ContainsKey()-Variante (Key ist vom Typ int, das Item auch) braucht
- mit 500 Einträgen, von denen 100 bereits existieren, eine lächerliche Millisekunde,
- mit 500.000 Einträgen, von denen ebenfalls 20% existieren, gerademal 908 ms,
- mit 5.000.000 Einträgen 9347 ms.
- Die Exception-Variante lässt bereits
- mit 500 Einträgen ganze 3500 ms auf sich warten.
- Den Vogel schießt aber die (dafür gedachte ) .TryGetValue() ab:
- mit 5.000.000 Einträgen 8738 ms, nicht wesentlich weniger als die ContainsKey() ...
Hier die Ergebnisse, wenn nicht 20% sondern 80% bereits existieren (5.000.000:
- ContainsKey(): 6774 ms,
- TryGetValue(): 3924 ms!!
Hat nicht geklappt
- Ich habe versucht, die Dictionary-Klasse so zu überladen, dass ich den Indexer überschrieben kann und einfach dahin, wo er die Exception schmeißen würde, meinen Lade- und Zurückgebe-Code hinschreiben kann. Leider sind ist der Member FindEntry() private (und nicht protected, wieso auch immer), sodass ich da nicht drankomme.
Im Übrigen haben sich die Testergebnisse verschiedener Durchläufe nur minimalst unterschieden - von wegen JIT. Ich habe ein Windows-Forms-Projekt ausgeführt und im Form-Load den Code gehabt. Natürlich wurde nur bei der eigentlichen Schleife und nicht beim Einfüllen der bereits existierenden 20% bzw. 80% oder beim Instanziieren der Objekte gemessen.
Es ist also ganz offensichtlich schneller, vorher abzufragen. Elegant geht das über TryGetValue(), einen kleinen Geschwindigkeitsvorteil bringt, der vor allem da ist, wenn die Werte eben doch existieren, weil dann FindEntry() nicht nochmal aufgerufen wird. Etwas langsamer könnte das dadurch werden, weil man ein <Out> ByRef verwenden muss. Weiß ich aber nicht ..., auf jeden Fall ist das im Endeffekt das Nonplusultra. Und 0,7 Mikrosekunden kann ich mir für die 40 Abfragen gerne erlauben ...
Viele Grüße
Philipp
------------------------------
http://www.x10receiver.net/ |  |
 | Sie sind nicht angemeldet! Um auf diesen Beitrag zu antworten oder neue Beiträge schreiben zu können, müssen Sie sich zunächst anmelden.
Einloggen | Neu registrieren |
  |
|
vb@rchiv CD Vol.6 vb@rchiv Vol.6
Geballtes Wissen aus mehr als 8 Jahren vb@rchiv!
Online-Update-Funktion Entwickler-Vollversionen u.v.m.Jetzt zugreifen Tipp des Monats Oktober 2025 Matthias KozlowskiUmlaute konvertierenErsetzt die Umlaute in einer Zeichenkette durch die entsprechenden Doppelbuchstaben (aus ä wird ae, usw.) TOP! Unser Nr. 1 
Neu! sevDataGrid 3.0
Mehrspaltige Listen, mit oder ohne DB-Anbindung. Autom. Sortierung, Editieren von Spalteninhalten oder das interaktive Hinzufügen von Datenzeilen sind ebenso möglich wie das Erstellen eines Web-Reports. Weitere Infos
|
|
|
Copyright ©2000-2025 vb@rchiv Dieter Otter Alle Rechte vorbehalten.
Microsoft, Windows und Visual Basic sind entweder eingetragene Marken oder Marken der Microsoft Corporation in den USA und/oder anderen Ländern. Weitere auf dieser Homepage aufgeführten Produkt- und Firmennamen können geschützte Marken ihrer jeweiligen Inhaber sein.
Diese Seiten wurden optimiert für eine Bildschirmauflösung von mind. 1280x1024 Pixel
|
|