Ich habe eine C# -Application, die Daten aus einer Textdatei in einem Dictionary-Objekt speichert. Die Menge der zu speichernden Daten kann ziemlich groß sein, so dass es viel Zeit kostet, die Einträge einzufügen. Bei vielen Elementen im Dictionary wird es aufgrund der Größenanpassung des internen Arrays, das die Daten für das Dictionary speichert, noch schlimmer. Also initialisierte ich das Dictionary mit der Anzahl der Items, die hinzugefügt werden, aber das hat keinen Einfluss auf die Geschwindigkeit.Hohe Laufzeit für Dictionary.Add für eine große Anzahl von Elementen
Hier ist meine Funktion:
private Dictionary<IdPair, Edge> AddEdgesToExistingNodes(HashSet<NodeConnection> connections)
{
Dictionary<IdPair, Edge> resultSet = new Dictionary<IdPair, Edge>(connections.Count);
foreach (NodeConnection con in connections)
{
...
resultSet.Add(nodeIdPair, newEdge);
}
return resultSet;
}
In meinen Tests, ich einfügen ~ 300k Artikel. Ich habe die Laufzeit mit ANTS Performance Profiler überprüft und festgestellt, dass sich die durchschnittliche Zeit für resultSet.Add (...) nicht ändert, wenn ich das Dictionary mit der benötigten Größe initialisiere. Es ist das gleiche wie wenn ich das Dictionary mit neuem Dictionary() initialisiere; (ungefähr 0,256 ms im Durchschnitt für jeden Add). Dies wird definitiv durch die Menge der Daten im Dictionary verursacht (ALTHOUGH ich initialisierte es mit der gewünschten Größe). Für die ersten 20 k Elemente beträgt die durchschnittliche Zeit für Add 0,03 ms für jedes Element.
Irgendeine Idee, wie man die Add-Operation schneller macht?
Vielen Dank im Voraus, Frank
ist hier mein IdPair-Struct:
public struct IdPair
{
public int id1;
public int id2;
public IdPair(int oneId, int anotherId)
{
if (oneId > anotherId)
{
id1 = anotherId;
id2 = oneId;
}
else if (anotherId > oneId)
{
id1 = oneId;
id2 = anotherId;
}
else
throw new ArgumentException("The two Ids of the IdPair can't have the same value.");
}
}
Überschreiben Sie 'Equals' und' GetHashCode' in Ihrer 'IdPair' Klasse? Wenn ja, erzeugt Ihr 'GetHashCode'-Algorithmus eine ordentliche Verteilung der Hashes? – LukeH
IdPair ist nur eine Struktur mit einem Konstruktor. Ich habe es meiner Frage hinzugefügt – Aaginor