vb@rchiv
VB Classic
VB.NET
ADO.NET
VBA
C#
Zippen wie die Profis!  
 vb@rchiv Quick-Search: Suche startenErweiterte Suche starten   Impressum  | Datenschutz  | vb@rchiv CD Vol.6  | Shop Copyright ©2000-2025
 
zurück

 Sie sind aktuell nicht angemeldet.Funktionen: Einloggen  |  Neu registrieren  |  Suchen

VB.NET - Fortgeschrittene
Re: 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/

alle Nachrichten anzeigenGesamtübersicht  |  Zum Thema  |  Suchen

 ThemaViews  AutorDatum
ContainsKey vs KeyNotFoundException abfangen1.137Philipp1519.12.08 22:50
Re: ContainsKey vs KeyNotFoundException abfangen750ModeratorRalf Ehlert19.12.08 23:05
Re: ContainsKey vs KeyNotFoundException abfangen871Philipp1519.12.08 23:37
Re: ContainsKey vs KeyNotFoundException abfangen756ModeratorRalf Ehlert20.12.08 10:29

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

Funktionen:  Zum Thema  |  GesamtübersichtSuchen 

nach obenzurück
 
   

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