요소가 없다는 조건에 따라지도에 요소를 추가해야하는지도를 반복합니다 (다른 조건 일 수 있음).CPU 및 메모리에 관한 C++의 무거운지도 삽입을 최적화하는 방법
내 큰 문제는 추가해야 할 큰 규모의 업데이트로 인해 응용 프로그램이 전체 CPU와 모든 메모리를 차지한다는 것입니다.
주 수업 : 주에서
class State {
int id;
int timeStamp;
int state;
}
방법 :
void State::updateStateIfTimeStampIsHigher(const State& state) {
if (this->id == state.getId() && state.getTimeStamp() > this->getTimeStamp()) {
this->timeStamp = state.getTimeStamp();
this->state = state.getState();
}
}
루프 코드 :가 data.insert처럼 보이는
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));
}
}
}
보고 KCacheGrind 데이터() 라인 대부분의 시간/메모리를 사용합니다. 나는 KCacheGrind를 처음 사용하지만,이 라인은 비용의 약 72 % 인 것으로 보입니다.
개선 방법에 대한 의견이 있으십니까?
''data'에 대해 ['std :: unordered_map'] (http://en.cppreference.com/w/cpp/container/unordered_map)을 고려 했습니까? https://stackoverflow.com/questions/3902644/choosing-between-stdmap-and-stdunordered-map –
1) Francois의 제안 2) 데이터와 알고리즘을 변경하는 방법은? 예를 들어 키에'int'가 필요합니까? '국가'란 무엇입니까? 복사 생성자가 빠르거나 작은 것으로 변경할 수있을만큼 작습니까? 'int' 키는 키없이 "std :: vector"를 사용하기에 충분히 밀도가 높습니까? 그리고 사용되지 않은 인덱스에서는 빈 간격이 있습니까? 등등 ... – Ped7g
2 개의지도가 동일한 구조를 가지고 있기 때문에 힌디어 삽입을 사용할 수 있습니다. 마지막에 삽입하기 때문에. 그것은 할당에 저장하지 않고 검색 시간에 저장합니다. –