Ho un C# -Applicazione che memorizza i dati da un file di testo in un dizionario-oggetto. La quantità di dati da memorizzare può essere piuttosto grande, quindi ci vuole un sacco di tempo per inserire le voci. Con molti elementi nel dizionario, la situazione peggiora ulteriormente, a causa del ridimensionamento dell'array interno, che memorizza i dati per il dizionario. Così ho inizializzato il dizionario con la quantità di elementi che verranno aggiunti, ma questo non ha alcun impatto sulla velocità.High Runtime per Dictionary.Add per una grande quantità di elementi
Qui è la mia funzione:
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;
}
Nel mio test, inserisco ~ 300k articoli. Ho controllato il tempo di esecuzione con ANTS Performance Profiler e ho rilevato che il tempo medio per resultSet.Add (...) non cambia quando inizializzo il dizionario con la dimensione necessaria. È lo stesso di quando inizializzo il dizionario con il nuovo dizionario(); (circa 0,256 ms in media per ogni aggiunta). Questo è sicuramente causato dalla quantità di dati nel dizionario (anche se l'ho inizializzato con la dimensione desiderata). Per i primi 20k articoli, il tempo medio per Aggiungi è di 0,03 ms per ogni articolo.
Qualche idea, come rendere più rapida l'aggiunta?
Grazie in anticipo, Frank
Ecco il mio 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.");
}
}
Stai eseguendo l'override di 'Equals' e' GetHashCode' nella classe 'IdPair'? In tal caso, l'algoritmo 'GetHashCode' produce una distribuzione decente degli hash? – LukeH
IdPair è solo una struttura con un costruttore. L'ho aggiunto alla mia domanda – Aaginor