Kiedy chcę się upewnić, że wpis, którego chcę użyć, zwykle to robię.Czy dzieje się to wolniej z powodu dwóch wyszukiwań zamiast jednego?
#include <unordered_map>
struct type { int member; };
std::unordered_map<type> map;
if (map.find(key) != map.end())
map[key].member = 42;
Myślę jednak, że wykonuje dwa wyszukiwań dla key
w mapie mieszania. To buforuje wyszukiwanie.
#include <unordered_map>
struct type { int member; };
std::unordered_map<type> map;
auto find = map.find(key);
if (find != map.end())
find->second.member = 42;
Pierwsza opcja wydaje się bardziej wyrazista. Czy to naprawdę wolniej?
Nie wiesz, że będzie to szybsze ", dopóki nie zostanie zmierzone za pomocą profilowania. A co z dodatkowym zapisem do pamięci, który jest przedmiotem handlu dla 'find' i wyszukiwania hash są szybkie. –
Lokalna zmienna automatyczna (iterator mapy) jest najprawdopodobniej zoptymalizowana w rejestrze procesora. Spacer wewnątrz drzewa mapy jest wykonany z pewnością dwa razy (i jeśli mapa ma węzeł 2^10, wymaga 10 odczytów w rzadkich miejscach pamięci) A ponieważ lokalizacje są rzadkie, buforowanie i wyszukiwanie hash niekoniecznie pomaga. Wektory (zamiast mapy) będziesz prawie pewny. –
Czy istnieje szansa, że kompilator optymalizuje to? – danijar