.[ ČeskéHry.cz ].
vector vs pole
Jdi na stránku 1, 2  Další
 
odeslat nové téma   Odpovědět na téma    Obsah fóra České-Hry.cz -> C / C++
Zobrazit předchozí téma :: Zobrazit následující téma  
Autor Zpráva
VODA



Založen: 29. 07. 2007
Příspěvky: 1721
Bydliště: Plzeň

PříspěvekZaslal: 21. září 2010, 23:31:25    Předmět: vector vs pole Odpovědět s citátem

Zdravím,
zeptám se asi úplně jako lama, ale jak je to s rychlostí procházení prvků vektoru o proti klasickému poli...
Jde mi o to, že mám třídu pro animovaný model. Mám dvě varianty. Jedna má data modelu uložena v dynamicky alokovaných polích, druhá má data kompletně uložená ve vektorech.
No a když renderuji model, tak v prvním případě mám 2x více FPS než u vectorové varianty...
Přitom způsob renderu je u obou případů úplně stejný...

Tak já nevím...

Předem děkuji za vysvětlení. Jsem rád za každou přiležitost, kdy se mohu něco přiučit... Wink
_________________
Opravdovost se pojí s trýzní...
Návrat nahoru
Zobrazit informace o autorovi Odeslat soukromou zprávu
VODA



Založen: 29. 07. 2007
Příspěvky: 1721
Bydliště: Plzeň

PříspěvekZaslal: 21. září 2010, 23:56:05    Předmět: Odpovědět s citátem

Trochu jsem ještě pokusoval a zjistil jsem, že přístup k prvkům vectoru je v DEBUG módu mnohem pomalejší než u pole, ale v RELEASE módu nad polem vítězí...
Takové srovnání (model je kreslen zatím glBegin/glEnd, má 2500 trianglů):

Debug: vector 147 FPS, pole 248 FPS
Release: vector 380 FPS, pole 332 FPS

Jako věděl jsem, že v Releasu pojede program rychleji, ale netušil jsem, že by to mohlo mít takový vliv...

Pokud je tu nějaký odborník, budu rád když mi to vysvětlíte... Wink
_________________
Opravdovost se pojí s trýzní...
Návrat nahoru
Zobrazit informace o autorovi Odeslat soukromou zprávu
Pavel



Založen: 29. 07. 2007
Příspěvky: 54
Bydliště: Litovel

PříspěvekZaslal: 22. září 2010, 06:47:02    Předmět: Odpovědět s citátem

Nejsem odbornik.

V debugu je pristup k prvku vectoru (operator[]) implementovan jinak nez v releasu. V debugu obsahuje nejspise alespon testy na to, zda ses trefil do alokovanych hranic - stejne jako metoda at.

I ve vectoru se interne alokuje pole, proto myslim, ze bude jen zanedbatelne pomalejsi, ale tezko bude rychlejsi.
Návrat nahoru
Zobrazit informace o autorovi Odeslat soukromou zprávu
rezna



Založen: 27. 07. 2007
Příspěvky: 2156

PříspěvekZaslal: 22. září 2010, 07:19:18    Předmět: Odpovědět s citátem

jak rika pavel - vector interne testuje spoustu veci, aby se debugu zarucilo ze nesahas mimo apod.
Návrat nahoru
Zobrazit informace o autorovi Odeslat soukromou zprávu
]semo[



Založen: 29. 07. 2007
Příspěvky: 1526
Bydliště: Telč

PříspěvekZaslal: 22. září 2010, 08:16:57    Předmět: Odpovědět s citátem

A ještě jedna věc: když spustíš release z Visual Studia (s debugerem), tak to je taky pomalejší. Release, Ctrl+F5, to je ta správná rychlost! :-).
_________________
Kdo jede na tygru, nesmí sesednout.
---
http://www.inventurakrajiny.cz/sipka/
Aquadelic GT, Mafia II, simulátory
Návrat nahoru
Zobrazit informace o autorovi Odeslat soukromou zprávu
Mantharis



Založen: 28. 07. 2007
Příspěvky: 39

PříspěvekZaslal: 22. září 2010, 09:31:35    Předmět: Odpovědět s citátem

Kdyz uz to tu resime tak me se hodne osvedcilo klasicky pole vuze svych programu uplne vypustit a vsechno cpat do vektoru.
Myslim ze az na tu debug rychlost a malilinko vetsi pametovou rezii neni jediny rozumny duvod klasicky dynamicky pole jeste pouzivat.
_________________
If the God gave us the source code we could bug the world.
Návrat nahoru
Zobrazit informace o autorovi Odeslat soukromou zprávu
Al



Založen: 23. 10. 2007
Příspěvky: 196

PříspěvekZaslal: 22. září 2010, 21:48:49    Předmět: Odpovědět s citátem

No tak měřit rychlost v debugu, to je velká bláznovina. V nastavení projektu ve visualku se dá nastavit i něco "napůl cesty", aby se třeba dal program krokovat a zároveň to nebylo hrozivě pomalé při běhu. Ale na měření rychlosti bych teda používal bez výjimky jen maximálně optimalizovaný release.
Návrat nahoru
Zobrazit informace o autorovi Odeslat soukromou zprávu
pcmaster



Založen: 28. 07. 2007
Příspěvky: 1827

PříspěvekZaslal: 23. září 2010, 06:43:01    Předmět: Odpovědět s citátem

Jediny hlavny rozdiel bude ten, ze (std::)vector je natahovaci. Tj, pri prekroceni uz alokovaneho poctu poloziek sa cely moze interne realokovat, co samozrejme znamena invalidaciu vsetkych iteratorov.
_________________
Off-topic flame-war addict since the very beginning. Registered since Oct. 2003!
Interproductum fimi omne est.
Návrat nahoru
Zobrazit informace o autorovi Odeslat soukromou zprávu
perry



Založen: 28. 07. 2009
Příspěvky: 879

PříspěvekZaslal: 23. září 2010, 07:01:06    Předmět: Odpovědět s citátem

Nějak nechápu, jak může být Vector rychlejší než klasické pole. Měl jsem za to, že vector je datová struktura obalující pole a umožňující, aby se pole natahovalo... Ale tím pádem by pořád mělo být rychlejší alokované pole na správnou velikost + jeho naplnění. U průchodu by to pak mělo být cca. stejné.
_________________
Perry.cz
Návrat nahoru
Zobrazit informace o autorovi Odeslat soukromou zprávu Zobrazit autorovi WWW stránky
Quiark



Založen: 29. 07. 2007
Příspěvky: 816
Bydliště: Chlívek 401

PříspěvekZaslal: 23. září 2010, 07:54:57    Předmět: Odpovědět s citátem

No s tím natahováním to imho není tak horké - když překročíš kapacitu, musí se naalokovat nové a stávající prvky do něj překopírovat (jeden po druhém, pomocí operator =)!. Funkce realloc() se tam nepoužívá.
_________________
Mám strach
Návrat nahoru
Zobrazit informace o autorovi Odeslat soukromou zprávu Zobrazit autorovi WWW stránky
pcmaster



Založen: 28. 07. 2007
Příspěvky: 1827

PříspěvekZaslal: 23. září 2010, 09:23:18    Předmět: Odpovědět s citátem

Ja som netvrdil, ze sa tam pouziva realloc() Smile Akurat efekt je velmi podobny, pretoze AFAIK interne pole vo vector je vzdy spojite v jednom kuse, takze ak za akutalne zaalokovanym polom je uz ina zaalkovana pamat, musi sa cele znovu zaalokovat (realokovat) na uplne inom mieste v jedinom bloku a obsah sa tam prekopiruje. Ci?
_________________
Off-topic flame-war addict since the very beginning. Registered since Oct. 2003!
Interproductum fimi omne est.
Návrat nahoru
Zobrazit informace o autorovi Odeslat soukromou zprávu
Quiark



Založen: 29. 07. 2007
Příspěvky: 816
Bydliště: Chlívek 401

PříspěvekZaslal: 23. září 2010, 15:21:18    Předmět: Odpovědět s citátem

Jo, ale to kopírování bude pomalé. realloc dokáže použít volný blok v heapu a tak zvětšit množství naalokované paměti bez kopírování.

Ale jelikož vector alokuje trochu paměti navíc, tak i při neustálém přidávání je cena za přidání amortizovaně konstantní, což je v pohodě, takže asi řešíme nesmysly Smile
_________________
Mám strach
Návrat nahoru
Zobrazit informace o autorovi Odeslat soukromou zprávu Zobrazit autorovi WWW stránky
VODA



Založen: 29. 07. 2007
Příspěvky: 1721
Bydliště: Plzeň

PříspěvekZaslal: 23. září 2010, 16:51:42    Předmět: Odpovědět s citátem

Také nevím proč to řešíte. Mě zajímal rozdíl rychlosti přístupu do vectoru přes operator [] o proti klasickému poli.

Předpokládám, že v releasu jsem u vectoru dosáhl lepších výsledků o proti poli díky lepší linearizaci dat...i když nevím přesně, jestli jsem jí docílil vlastní zásluhou... Wink
_________________
Opravdovost se pojí s trýzní...
Návrat nahoru
Zobrazit informace o autorovi Odeslat soukromou zprávu
Tringi



Založen: 28. 07. 2007
Příspěvky: 290

PříspěvekZaslal: 24. září 2010, 10:22:54    Předmět: Odpovědět s citátem

Jsou dvě alternativy.
První je, že důvod pro výkonový rozdíl se skrývá ve tvém kódu.
Druhou pak to, že kompilátor svou magií ví, že se jedná o vektor a jak se s ním pracuje (nebo spíš přesněji ví co nelze), a na základě toho umí kód zoptimalizovat lépe než pro obyčejné pole. Ale to je můj tip, používám MinGW, a nikoliv MSVC.
_________________
WWW | GitHub | TW
Návrat nahoru
Zobrazit informace o autorovi Odeslat soukromou zprávu Zobrazit autorovi WWW stránky
VODA



Založen: 29. 07. 2007
Příspěvky: 1721
Bydliště: Plzeň

PříspěvekZaslal: 24. září 2010, 11:56:27    Předmět: Odpovědět s citátem

No, já jsem to asi zapomněl zmínit, ale já používám taktéž minGW pod Eclipsem... Wink
_________________
Opravdovost se pojí s trýzní...
Návrat nahoru
Zobrazit informace o autorovi Odeslat soukromou zprávu
Zobrazit příspěvky z předchozích:   
odeslat nové téma   Odpovědět na téma    Obsah fóra České-Hry.cz -> C / C++ Časy uváděny v GMT + 1 hodina
Jdi na stránku 1, 2  Další
Strana 1 z 2

 
Přejdi na:  
Nemůžete odesílat nové téma do tohoto fóra
Nemůžete odpovídat na témata v tomto fóru
Nemůžete upravovat své příspěvky v tomto fóru
Nemůžete mazat své příspěvky v tomto fóru
Nemůžete hlasovat v tomto fóru


Powered by phpBB © 2001, 2005 phpBB Group


Vzhled udelal powermac
Styl "vykraden" z phpBB stylu MonkiDream - upraveno by rezna