Primero debe comprender qué es un mapa y qué representan las operaciones que está realizando. Un std::map
es un árbol binario equilibrado, la búsqueda tomará operaciones O(log N)
, cada una de las cuales es una comparación de las teclas más algunas adicionales que puede ignorar en la mayoría de los casos (administración de punteros). La inserción lleva más o menos el mismo tiempo para ubicar el punto de inserción, más la asignación del nuevo nodo, la inserción real en el árbol y el reequilibrio. La complejidad es nuevamente O(log N)
aunque las constantes ocultas son más altas.
Cuando intenta determinar si una clave está en el mapa antes de la inserción, está incurriendo en el costo de la búsqueda y si no tiene éxito, el mismo costo para ubicar el punto de inserción. Puede evitar el costo adicional usando std::map::insert
que devuelve un par con un iterador y un bool que le informa si la inserción realmente sucedió o si el elemento ya estaba allí.
Más allá de eso, es necesario entender lo costoso que es comparar sus llaves, que se cae de lo que muestra el interrogación (MyStruct
pudo contener sólo una int
o un millar de ellos), que es algo que hay que tener en cuenta.
Por último, podría darse el caso de que un map
no es la estructura de datos más eficiente para sus necesidades, y es posible que desee considerar el uso ya sea un (tabla hash) std::unordered_map
que ha esperado inserciones de tiempo constantes (si la función hash no es horrible) o para pequeños conjuntos de datos incluso un conjunto ordenado simple (o std::vector
) en el que puede utilizar la búsqueda binaria para localizar los elementos (esto reducirá el número de asignaciones, al costo de inserciones más costosas, pero los tipos retenidos son lo suficientemente pequeños como para valer la pena)
Como siempre con el rendimiento, mida y luego intente comprender dónde se está gastando el tiempo. También tenga en cuenta que un 10% del tiempo dedicado a una función o estructura de datos en particular puede ser mucho o casi nada, dependiendo de cuál sea su aplicación. Por ejemplo, si su aplicación solo realiza búsquedas e inserciones en un conjunto de datos, y eso solo requiere un 10% de la CPU, ¡tiene mucho que optimizar en cualquier otro lugar!
Sin el código fuente, no podemos decirlo. También mire la versión de 'insert' que devuelve un par (esto responderá a su segunda pregunta) –
¿Podría compartir información sobre su función de comparación en' MyStruct' que también utiliza el mapa? – amit
¿Puede proporcionarnos un poco más de información sobre lo que está haciendo dentro de la función mencionada? Como la complejidad de búsqueda del mapa es O (log n), no estoy seguro de dónde vendrá una mejora. –