J'itérer une carte où je dois ajouter des éléments sur cette carte en fonction d'une condition qu'un élément ne se trouve pas (il pourrait être toute autre condition).Comment optimiser l'insertion de carte lourde en C++ concernant CPU et de la mémoire
Mon principal problème est que, avec une grande échelle des mises à jour à ajouter, l'application prend toute la CPU et toute la mémoire.
État Classe:
class State {
int id;
int timeStamp;
int state;
}
Méthode État:
void State::updateStateIfTimeStampIsHigher(const State& state) {
if (this->id == state.getId() && state.getTimeStamp() > this->getTimeStamp()) {
this->timeStamp = state.getTimeStamp();
this->state = state.getState();
}
}
code Loop:
std::map<int, State> data;
const std::map<int, State>& update;
for (auto const& updatePos : update) {
if (updatePos.first != this->toNodeId) {
std::map<int, State>::iterator message = data.find(updatePos.first);
if (message != data.end() && message->first) {
message->second.updateStateIfTimeStampIsHigher(updatePos.second);
} else {
data.insert(std::make_pair(updatePos.first, updatePos.second));
}
}
}
Regarder les données KCacheGrind il semble que le data.insert() ligne prend le plus de temps/de mémoire. Je suis nouveau à KCacheGrind, mais cette ligne semble être d'environ 72% du coût.
Avez-vous des suggestions pour améliorer ceci?
Avez-vous considéré ['std :: unordered_map'] (http://fr.cppreference.com/w/cpp/container/unordered_map) pour 'data'? Vous devriez lire ceci: https://stackoverflow.com/questions/3902644/choosing-between-stdmap-and-stdunordered-map –
1) ce que François suggère 2) comment changer les données et les algorithmes? Par exemple, avez-vous besoin de 'int' pour la clé? Qu'est-ce que 'State'? Est-il assez petit pour que le constructeur de copie soit rapide, ou peut-il être changé pour être petit? La touche 'int' est-elle assez" dense "pour utiliser' std :: vector' à la place sans clé, et avoir juste des espaces vides sur les index inutilisés? etc, etc ... – Ped7g
Puisque les deux cartes ont la même structure, vous pouvez utiliser l'insertion suggérée, puisque vous êtes sûr d'insérer à la fin. Cela ne permet pas d'économiser sur les allocations, mais sur le temps de recherche. –