Próbuję porównać wydajność między surowymi wskaźnikami, boost shared_ptr i boost weak_ptr. Na części do dereferencji oczekiwałem, że shared_ptr i raw_ptr są równe, ale wyniki pokazują, że shared_ptr jest około dwa razy wolniejsza. Do testu tworzę tablicę albo wskaźników lub współdzielonych wskazówki do wskazówki, a następnie dereferencing w pętli jak ta:Podnieś shared_ptr koszt dereferencji
int result;
for(int i = 0; i != 100; ++i)
{
for(int i = 0; i != SIZE; ++i)
result += *array[i];
}
Kod pełny dla testu można znaleźć tutaj: https://github.com/coolfluid/coolfluid3/blob/master/test/common/utest-ptr-benchmark.cpp
czasy testowe dla zoptymalizowanej budowie bez twierdzeń można znaleźć tutaj: http://coolfluidsrv.vki.ac.be/cdash/testDetails.php?test=145592&build=7777
wartości to są „DerefShared czas” i „DerefRaw czas”
Zgaduję, że test może być wadliwy, ale nie udało mi się ustalić, skąd się bierze różnica. Profilowanie pokazuje, że operator * z shared_ptr zostaje wstawiony, wydaje się, że zajmuje to więcej czasu. Sprawdziłem dwukrotnie, czy asercja wzmocnienia jest wyłączona.
Byłbym bardzo wdzięczny, gdyby ktoś mógł wyjaśnić, skąd może pochodzić różnica.
Dodatkowa samodzielna Test: https://gist.github.com/1335014
+1, myślałem o tym na drugi dzień też. –
Efekty pamięci podręcznej? shared_ptr jest większy niż surowy wskaźnik, więc twoja tablica pokryje więcej linii pamięci podręcznej i będzie potrzebować więcej czasu na czytanie. –
Na jakiej platformie są uruchomione te testy? – SoapBox