2011-02-14 10 views

Odpowiedz

30

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 instancji boost::array może być znacznie droższa; w kolejności kopiowania elementów n. Ale w C++ 0x, którego częścią będzie std::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.

+1

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

+2

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ść). –

+0

@pnos: To prawda. – Puppy

16

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ć!

+2

+1 za nazewnictwo narzędzi – grzkv

+0

Hej, Bardzo Śpioszka to ładne, małe narzędzie! (Poprawiłem link do tego). – Nate

+0

@Nate: dzięki za poprawienie linku :-) – Nawaz

2

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.

+0

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

+0

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). –

12

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.

+0

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

Powiązane problemy