Keine wirkliche Frage, weil ich schon die Antwort gefunden habe, aber immer noch interessant.Warum ist Dictionary.First() so langsam?
Ich dachte immer, dass die Hash-Tabelle der schnellste assoziative Container ist, wenn Sie richtig hashen.
Jedoch ist der folgende Code schrecklich langsam. Es führt nur etwa 1 Million Iterationen aus und benötigt für eine Core 2-CPU mehr als 2 Minuten Zeit.
Der Code führt Folgendes aus: Er verwaltet die Sammlung todo
der Elemente, die verarbeitet werden müssen. Bei jeder Iteration es ein Element aus dieser Sammlung kommt (egal, welche Artikel), löscht sie, verarbeitet sie, wenn sie nicht verarbeitet wurde (möglicherweise mehr Elemente hinzufügen zu verarbeiten), und wiederholt dies, bis es keine Elemente zu verarbeiten ist.
Der Täter scheint die Dictionary.Keys.First() Betrieb zu sein.
ist die Frage, warum verlangsamen wird?
Stopwatch watch = new Stopwatch();
watch.Start();
HashSet<int> processed = new HashSet<int>();
Dictionary<int, int> todo = new Dictionary<int, int>();
todo.Add(1, 1);
int iterations = 0;
int limit = 500000;
while (todo.Count > 0)
{
iterations++;
var key = todo.Keys.First();
var value = todo[key];
todo.Remove(key);
if (!processed.Contains(key))
{
processed.Add(key);
// process item here
if (key < limit) { todo[key + 13] = value + 1; todo[key + 7] = value + 1; }
// doesn't matter much how
}
}
Console.WriteLine("Iterations: {0}; Time: {1}.", iterations, watch.Elapsed);
Daraus ergibt sich:
Iterations: 923007; Time: 00:02:09.8414388.
Durch einfaches Ändern Wörterbuch zu SortedDictionary ergibt:
Iterations: 499976; Time: 00:00:00.4451514.
300-mal schneller, während nur 2-mal weniger Iterationen mit.
Das gleiche geschieht in Java. Verwendet HashMap
anstelle von Dictionary
und keySet().iterator().next()
anstelle von Keys.First()
.
Wörterbücher sind ungeordnet. – SLaks
Das ist nicht Java, ist es ???? – polygenelubricants
@polygeneLubricants: es ist sowohl als Java und .net markiert, und in seinem letzten Satz OP sagt "Das gleiche passiert in Java" – Amadan