마치 마침내 약간의지도 삽입 속도 (삽입하기 전에 정렬)를 개선 한 것처럼 보입니다. 이 결과에 대해 어떻게 생각하십니까? 더 이상 최적화가 있습니까?지도 삽입 속도를 높이는 방법은 무엇입니까?
#include <map>
#include <iostream>
#include <algorithm>
int main (int argc, char* argv []) {
//a map<size_t, size_t> random initilisation
std::map<size_t, size_t> m0, m1;
{
std::vector<std::pair<size_t, size_t> > t (10000, std::pair<size_t, size_t> ((size_t) -1, (size_t) -1));
std::vector<std::pair<size_t, size_t> >::iterator i (t.begin());
for (; i != t.end(); ++i) {
i->first = rand() % 1000000;
i->second = rand() %1;
}
m0.insert (t.begin(), t.end());
m1 = m0;
}
//vins :
std::vector<std::pair<size_t, size_t> > vins (10000, std::pair<size_t, size_t> (0, 0));
{
std::vector<std::pair<size_t, size_t> >::iterator i (vins.begin());
for (; i != vins.end(); ++i) {
i->first = rand() % 1000000;
i->second = rand() %1;
}
}
//normal insertion
clock_t t0 (clock()), t1 (t0);
{
m0.insert (vins.begin(), vins.end());
}
t1 = clock();
std::cout << "normal insertion took " << (size_t) (t1 - t0) << " ticks" << std::endl;
//sort + hint insertion
t0 = t1;
{
std::sort (vins.begin(), vins.end(), [] (std::pair<size_t, size_t>& p0, std::pair<size_t, size_t>& p1)->bool {
return (p0.first < p1.first ? true:false);
});
std::map<size_t, size_t>::iterator ihint (m1.begin());
//std::vector<std::pair<size_t, size_t> >::iterator i (vins.begin());
//imroved and more C++11 solution
std::for_each (vins.begin(), vins.end(), [&ihint, &m1] (std::pair<size_t, size_t>& p) {
ihint = m1.insert (ihint, p);
});
}
t1 = clock();
std::cout << "insertion after sorting took " << (size_t) (t1 - t0) << " ticks" << std::endl;
if (m0 != m1) std::cout << "but insertion is nok" << std::endl;
else std::cout << "and insertion is ok" << std::endl;
}
레노버의 결과는 센터 생각 :
정렬 한 후 삽입 (1706)했다
틱
틱하고 그렇지 않으면 삽입
을 다음'표준 : unordered_map도 '더 빠를 수도 있습니다. 또한 컴파일러 최적화가 켜져 있는지 확인하십시오 (보통'-O2' 또는'-O3'). 내 컴퓨터에서 정상적인 힌트 삽입에 대해 이러한 향상된 성능을 3 배로 사용하여 두 번째 결과에서 몇 백 개 틱을 두드렸다. 마지막으로 [codereview] (https://codereview.stackexchange.com/)에 더 적합 할 수 있습니다. – hnefatl
나는 고속도로를 사용 중이다. 그러나 표준 std :: unordered_map보다 map이 더 낫다고 믿었다. 내가 잘못 ? –
@hnefatl 형식이 모호한 제 질문 이었기 때문에 제 의견을 삭제했습니다. 이 맵을 더 빠르게 만들 수있는 컴파일러 최적화가 있다면 주로 관심이있었습니다. 그래서'std :: unordered_map'을 이미 사용하고 있다면 가능한 컴파일러 최적화를 사용하여 더 빠르게 만들 수 있습니까? –