Jaka jest wydajność boost::array
w porównaniu zi jakie czynniki mają na nią znaczący wpływ?Standardowy wektor i tablica wzmocnienia: która jest szybsza?
Odpowiedz
boost::array
(lub C++ 0x's std::array
) powinien być szybszy niż std::vector
, ponieważ instancje są całkowicie na stosie. Oznacza to, że boost::array
nie ma przydzielania sterty, a także oznacza, że nie może przekroczyć rozmiaru określonego dla niego podczas konstrukcji.
Celem boost::array
ma służyć jako cienką warstwę wokół prymitywnych tablic, więc można traktować je jako standardowe pojemniki z .begin()
, .end()
itp Dobrych kompilatory powinno wyeliminować wszystkie napowietrznej boost::array
taki sposób, że wykonuje ona identycznie jak prymitywnych tablic.
Cała ta dotycząca „default” setup, gdzie nie masz niestandardowych podzielników i zmierzyć prostych rzeczy jak budowa tablicy, dostępu i modyfikacji elementów. Z drugiej strony wszystko może się zmienić w innych testach, na innych platformach lub przy sprytnej konfiguracji. Na przykład,
- jeśli utworzyć niestandardową przydzielania, może pozyskania dużej puli pamięci podczas uruchamiania programu, a następnie budowy lub zmiany rozmiaru
std::vector
nie może dłużej być wszystko, co drogie. - Zamiana jednego
std::vector
na inny jest zwykle bardzo szybką operacją; szybkość zamiany dwóch wskaźników. Zamiana dwóch instancjiboost::array
może być znacznie droższa; w kolejności kopiowania elementówn
. Ale w C++ 0x, którego częścią będziestd::array
, zamiana dwóch tablic będzie znowu szybka, dzięki odniesieniom rvalue i ich semantyki ruchu. - Kopiowanie wektora może być bardzo szybką operacją; tak szybko, jak kopiowanie wskaźnika (kopiowanie przy zapisie). Kopiowanie
boost::array
może wymagać skopiowania każdego elementu tablicy. Z drugiej strony, czasami kopiowanie dowolnego obiektu jest bardzo szybkie, nawet szybsze niż kopiowanie wskaźnika, a nawet w kompilatorze C++ 03 - dzięki funkcji kopiowania.
Możesz profilować, aby zobaczyć, który jest szybszy w użyciu, ale nawet ten test da ci wyobrażenie o konkretnej wersji konkretnego kompilatora na konkretnej platformie.
Brzmi dla mnie, ponieważ nie można użyć tablicy boost :: dla dużych rozmiarów macierzy. W przeciwnym razie ryzykujesz przepełnienie stosu. Poprawny? – ypnos
Jeśli przydzielisz go na stos, @Ypnos, a następnie tak, możesz spodziewać się przepełnienia stosu (lub błędu kompilatora, jeśli kompilator nie zezwala na typy przekraczające pewien rozmiar). Jeśli przydzielasz dynamicznie, nie powinieneś dostawać przepełnienia stosu, chyba że pomyłkowo przekazujesz tablicę według wartości. (Ale błąd kompilatora nadal stanowi ryzyko, gdy tylko przydzielisz tę wartość). –
@pnos: To prawda. – Puppy
Najlepszym sposobem na wyciągnięcie wniosków jest pisanie programów w celu przetestowania ich wydajności przy dużej ilości danych. Jak inaczej można dojść do jakiegokolwiek wniosku?
Podczas gdy jesteś na to, być może trzeba kilka narzędzi, aby pomóc, takie jak VTune lub AMD CodeAnalyst Performance Analyzer itp Very Sleepy (bezpłatnego narzędzia) jest C/C++ profiler CPU dla systemów Windows. Możesz ich spróbować!
array
i vector
służą nieco innym celom. Jeśli zainicjujesz model vector
do wymaganego rozmiaru i nie zostanie on nigdy przydzielony ponownie, wydajność między tymi dwoma elementami będzie taka sama. array
obsługuje tylko tablice wielkości statycznie (tablice w stylu C, jeśli wolisz). vector
może się rozwinąć, jeśli wepchniesz więcej obiektów do kontenera, niż ma to obecnie miejsce.
Ponieważ wektory muszą uzyskać dostęp do podstawowych danych za pomocą wskaźnika, może to być niewielka przewaga wydajności dla tablic, ponieważ dostęp wektora będzie musiał przejść przez jeszcze jeden poziom pośredni. Wątpię, czy jest to czynnik, który warto rozważyć na nowoczesnym sprzęcie, z wyjątkiem ekstremalnych przypadków. – Ferruccio
Nie mówił o tablicy w stylu C, miał na myśli klasę szablonową 'std :: array' (vel' boost :: array'), która ma taki sam efekt przekierowania jak "hit" jako wektor (oba bycie tak małym, to i tak nie ma znaczenia). –
Szybciej po co? std::vector
jest szybszy do wpisania, ponieważ ma mniej znaków.
Nie ma znaczenia, co jest szybsze, porównuje się dwie różne rzeczy - macierz wielkości statystycznej z tablicą o dynamicznych rozmiarach. To, którego użyć, zależy od aplikacji i nie ma nic wspólnego z prędkością.
Czy chcesz obsługiwać samolot lub samochód w jakimś miejscu? To zależy od czegoś więcej, niż po prostu "szybciej".
boost::array
może być szybciej przeznaczyć bo to, na typowych maszynach, na stos. Lub std::vector
może być prawie tak szybko ze względu na niestandardowy schemat alokacji pamięci.
Ale to tylko przydział. A co z używaniem? Oba są tylko wskaźnikami w tablicy, więc może nie ma różnicy. Ale co z przenoszeniem lub zamianą? boost::array
z pewnością nie może zrobić tak szybko, ponieważ std::vector
wystarczy przenieść/zamienić wskaźnik. A może nie, kto wie?
Musisz profilować i patrzeć na zespół. Nikt nie może w magiczny sposób wiedzieć, jak się sprawy mają dla ciebie.
A jeśli masz dużo danych do przetworzenia, czas potrzebny na przydzielenie 'std :: vector' może łatwo zostać zalany przez czas potrzebny do iteracji przez to, co przeznaczyłeś. Zwłaszcza jeśli zaczniesz robić wiele przejść przez dane. – SirGuy
- 1. Porównanie pamięci, która jest szybsza?
- 2. Która pętla jest szybsza, kiedy lub dla?
- 3. Słownik Pythona kontra lista, która jest szybsza?
- 4. Która jest szybsza, equalsIgnoreCase lub compareToIgnoreCase
- 5. Statyczne elementy i serializacja wzmocnienia
- 6. Wektor. <> Vs tablica
- 7. jQuery: która jest szybsza w tym przypadku (.find) vs (.filter)
- 8. Zmienna zamiana zi bez zmiennej pomocniczej - która jest szybsza?
- 9. unordered_map: która z nich jest szybsza find() lub count()?
- 10. Tablica numpy, która jest (n, 1) i (n,)
- 11. Wektor inicjalizujący wolniej niż tablica ... dlaczego?
- 12. Dlaczego wektoryzacja jest szybsza niż pętle?
- 13. Czy jest szybsza implementacja TList?
- 14. Czy możliwe jest przesunięcie wzmocnienia :: opcjonalnie?
- 15. Praktyka i odkrycie typu Erostu wzmocnienia
- 16. Java - Szybsza alternatywa dla Math.pow() i Math.sqrt()
- 17. Jak działa funkcja Interlocked i dlaczego jest szybsza niż blokada?
- 18. Tablica JavaScript nie jest dostępna jako tablica
- 19. Dlaczego akumulacja jest szybsza niż cykl prosty?
- 20. Która metoda jest szybsza, ekspresowe: renderowanie po stronie serwera a renderowanie po stronie klienta
- 21. Czy niezmienna bitmapa jest szybsza niż zmienna?
- 22. Czy jest szybsza alternatywa dla Dir.glob Ruby?
- 23. Czy mogę porównać kod IL, aby określić, która technika jest szybsza lub lepsza?
- 24. Standardowy kontener C++ i kontener STL w C++
- 25. Czy sekcja krytyczna jest zawsze szybsza?
- 26. Czy usługa fastcall jest naprawdę szybsza?
- 27. python pandy: dlaczego mapa jest szybsza?
- 28. Szybsza alternatywa dla eval?
- 29. OpenMP i STL Wektor
- 30. Serializacja wzmocnienia, deserializacja surowych macierzy C
Wątpię, czy może to być wąskie gardło w Twojej aplikacji. – Benoit
@Benoit. Robię naukowe obliczenia, a szybkość jest BARDZO ważna. – grzkv
@Roman: Powinieneś wiedzieć, aby profilować. – GManNickG