Per prima cosa devi capire cos'è una mappa e quali sono le operazioni che stai facendo. A std::map
è un albero binario bilanciato, la ricerca richiederà le operazioni O(log N)
, ognuna delle quali è un confronto delle chiavi più alcuni extra che è possibile ignorare nella maggior parte dei casi (gestione dei puntatori). L'inserimento impiega all'incirca lo stesso tempo per individuare il punto di inserimento, oltre all'assegnazione del nuovo nodo, l'effettivo inserimento nell'albero e il ribilanciamento. La complessità è ancora O(log N)
sebbene le costanti nascoste siano più alte.
Quando si tenta di determinare se una chiave è presente nella mappa prima dell'inserimento, si incorre nel costo della ricerca e, se non riesce, lo stesso costo per individuare il punto di inserimento. Puoi evitare il costo aggiuntivo utilizzando std::map::insert
che restituisce una coppia con un iteratore e un bool che ti dice se l'inserimento è effettivamente avvenuto o se l'elemento era già lì.
Oltre a ciò, è necessario capire quanto costoso è quello di confrontare le chiavi, che cade fuori di ciò che gli spettacoli interrogativi (MyStruct
poteva contenere un solo int
o mille di essi), che è qualcosa che devi prendere in account.
Infine, potrebbe essere il caso che una map
non è la struttura dei dati più efficiente per le vostre esigenze, e si potrebbe prendere in considerazione utilizzando un (tabella hash) std::unordered_map
che ha previsto inserimenti di tempo costanti (se la funzione di hash non è orribile) o per piccoli set di dati anche un array ordinato ordinario (o std::vector
) su cui è possibile utilizzare la ricerca binaria per individuare gli elementi (questo ridurrà il numero di allocazioni, al costo di inserimenti più costosi, ma se i tipi mantenuti sono abbastanza piccoli potrebbe valerne la pena)
Come sempre con le prestazioni, misurare e quindi cercare di capire dove viene trascorso il tempo. Si noti inoltre che il 10% del tempo trascorso in una particolare funzione o struttura dati potrebbe essere molto o quasi nulla, a seconda di quale sia l'applicazione. Ad esempio, se la tua applicazione sta solo eseguendo ricerche e inserimenti in un set di dati, e che richiede solo il 10% della CPU, hai molto da ottimizzare ovunque!
fonte
2012-04-15 20:43:24
Senza codice sorgente, non possiamo davvero dire. Guarda anche la versione di 'insert' che restituisce una coppia (questo risponderà alla tua seconda domanda) –
Potresti condividere informazioni sulla funzione di confronto su' MyStruct' che la mappa usa anche tu? – amit
Puoi fornire qualche informazione in più su cosa stai facendo all'interno della funzione menzionata? Poiché la complessità della mappa di ricerca è O (log n), non sono sicuro da dove arriverà un miglioramento. –