Diskuze: Optimalizace (přesunutá diskuse)

C++ C a C++ Optimalizace (přesunutá diskuse)

Avatar
Jiří Gracík
Redaktor
Avatar
Jiří Gracík:

C++ se přece upřednostňuje před C# třeba u her ne :o?

Odpovědět 2.5.2013 16:57
Creating websites is awesome till you see the result in another browser ...
Avatar
David Čápka
Tým ITnetwork
Avatar
Odpovídá na Jiří Gracík
David Čápka:

Pokud jsi velká firma se stádem programátorů tak ano, jinak ani omylem.

Nahoru Odpovědět 2.5.2013 16:58
Miluji svou práci a zdejší komunitu, baví mě se rozvíjet, děkuji každému členovi za to, že zde působí.
Avatar
Lukáš Hruda (Luckin):

Allegro sice není moderní, ale je velmi jednoduché. Otázka je, jak umí ten jazyk, ale já když jsem začínal s allegrem tak jsem v C/C++ neznal ještě ani funkce, a naučil sem se ho hned :D

 
Nahoru Odpovědět 2.5.2013 16:59
Avatar
Kit
Redaktor
Avatar
Odpovídá na Jiří Gracík
Kit:

C++ se spíš upřednostňuje proto, že v C# je nutné rychlé programy psát objektově a to každý nezvládne. C++ snese i smíšený přístup.

Nahoru Odpovědět 2.5.2013 17:01
Vlastnosti objektů by neměly být veřejné. A to ani prostřednictvím getterů/setterů.
Avatar
David Čápka
Tým ITnetwork
Avatar
Odpovídá na Lukáš Hruda (Luckin)
David Čápka:

No zatím ho tu Honza už týden instaluje, tak nevím :) Navíc mi C++ nepřijde vůbec jako vhodný jazyk, když dělá v GameMakeru. Co jsem viděl počiny do Devbookátoru v Allegru, tak po několitýdenní práce byli schopni přehrát zvuk a zobrazit průhledný obrázek, tím mě Allegro tedy moc nepřesvědčilo.

Nahoru Odpovědět 2.5.2013 17:13
Miluji svou práci a zdejší komunitu, baví mě se rozvíjet, děkuji každému členovi za to, že zde působí.
Avatar
David Čápka
Tým ITnetwork
Avatar
Odpovídá na Kit
David Čápka:

Je to hlavně o rychlosti, profesionální hry mají spoustu zátěže (fyzika, stovky grafických efektů), které se v amatérských hrách neobjeví.

Nahoru Odpovědět 2.5.2013 17:15
Miluji svou práci a zdejší komunitu, baví mě se rozvíjet, děkuji každému členovi za to, že zde působí.
Avatar
Odpovídá na Jiří Gracík
Luboš Běhounek (Satik):

Ano, 95% "velkých" her se píše v C++, je to především kvůli rychlosti.

Sdraco: i malé firmy s pár programátory mohou psát v C++, treba kamos dela sam po vecerech v C++ 3D engine, uz ma planetu, kde muzes odzoomovat do vesmiru a nebo prizoomovat az treba na snezku, ma tam vodu, naky stromy, tusim, ze uz i mraky...

Nahoru Odpovědět 2.5.2013 17:22
:)
Avatar
Odpovídá na David Čápka
Lukáš Hruda (Luckin):

Allegro je jednoduché na naučení, ale moc toho neumí.
http://leteckaposta.cz/992005420
Já v allegru psal tohle. Přihlašoval jsem to do devbookátoru téměř ve stejném stavu jako je to teď, nebyl čas ani nálada něco tam přidělávat. Tohle jsem ale napsal za pár dní a engine je plně funkčí, už v podstatě stačí jenom dávat cihly které chci, tam kam chci. Plus přidělat menu, nastavení a nějaké ukládání. Co se týká nějakých hezkých efektů tak toho v allegru moc neuděláš.
Jinak ve výkonu bych řekl, že allegro na tom také není nejlépe, přijde mi že hrozně pomalu vykresluje.

 
Nahoru Odpovědět 2.5.2013 17:26
Avatar
Zdeněk Pavlátka
Tým ITnetwork
Avatar
Odpovídá na David Čápka
Zdeněk Pavlátka:

Já začal s C++ proto, že už mě přestával bavit Gamemaker.
Luckin: Allegro bylo pomalé, dokud nevyšlo Allegro 5.

Editováno 2.5.2013 17:35
Nahoru Odpovědět 2.5.2013 17:33
Kolik jazyků umíš, tolikrát jsi programátor.
Avatar
Kit
Redaktor
Avatar
Odpovídá na David Čápka
Kit:

Je však spousta tříd, které jsou napsány v C++, ale jsou použitelné v C#. Pokud je programátor umí používat, dostane se s výkonem na podobné hodnoty.

Jen asi 10 % programu má smysl výkonnostně optimalizovat. Pokud se pro těchto 10 % využijí patřičné systémové knihovny, aplikace je velmi rychlá i v C# či Javě.

Nahoru Odpovědět 2.5.2013 17:33
Vlastnosti objektů by neměly být veřejné. A to ani prostřednictvím getterů/setterů.
Avatar
Odpovídá na Luboš Běhounek (Satik)
Libor Šimo (libcosenior):

Satik napísal:
...treba kamos dela sam po vecerech v C++ 3D engine, uz ma planetu...

Predpokladám, že nepoužíva allegro, ale niečo iné. Nie?

Editováno 2.5.2013 17:41
Nahoru Odpovědět 2.5.2013 17:39
Aj tisícmíľová cesta musí začať jednoduchým krokom.
Avatar
Odpovídá na Kit
Lukáš Hruda (Luckin):

Když už mluvíš o těch třídách napsaných v C++. Můžu se podělit o zajímavý fakt. Měřil jsem v C++ rychlost naplnění pole o 200M prvcích a to samé s vectorem z STL. U pole to trvalo cca 650 - 700 ms, vektor se naplnil za cca 450 ms. Docela by mě zajímalo, v čem nabo jak je napsaný vector, že se s ním pracuje rychleji než s polem.

 
Nahoru Odpovědět 2.5.2013 17:43
Avatar
Libor Šimo (libcosenior):

Sorry, mám pocit že píšem blbiny.

Nahoru Odpovědět  +1 2.5.2013 17:43
Aj tisícmíľová cesta musí začať jednoduchým krokom.
Avatar
Odpovídá na Libor Šimo (libcosenior)
Luboš Běhounek (Satik):

Používá přímo DirectX, i když si teď nejsem jistý, jestli to nepřepisoval do OpenGL.

Nahoru Odpovědět 2.5.2013 17:46
:)
Avatar
Odpovídá na Lukáš Hruda (Luckin)
Luboš Běhounek (Satik):

Můžeš mi ten zdroják poslat?

Kouknul bych se na to a řekl ti, protože Vector by měl být pomalejší, má nějakou režii.

Zkoušel jsi to v Release módu?

Nahoru Odpovědět 2.5.2013 17:48
:)
Avatar
Kit
Redaktor
Avatar
Odpovídá na Lukáš Hruda (Luckin)
Kit:

Kompilátory mívají k dispozici optimalizace, které není radno v běžných případech zapínat, ale v některých případech mohou zvýšit výkon konkrétní knihovní funkce.

Konkrétně se v C++ se velmi často používá pro práci s polem počítaný cyklus. Při vhodné optimalizaci zůstává řídící proměnná v registru. Při ještě větší optimalizaci se v určitých případech dá celý cyklus vykonat jednou strojovou instrukcí procesoru, jenže se to nevyplatí pro malá pole (musí se předem těch registrů plnit víc).

Také firma vyvíjející knihovny může mít lepší (a dražší) kompilátor C++, který mezi lidi nepustí, aby měla výkonnostní převahu nad konkurencí. Někdy stačí jen přehodit dvě nezávislé strojové instrukce a zvýší to výkon.

Nahoru Odpovědět 2.5.2013 17:54
Vlastnosti objektů by neměly být veřejné. A to ani prostřednictvím getterů/setterů.
Avatar
Jiří Gracík
Redaktor
Avatar
Jiří Gracík:

Sorry kluci, já nechtěl rozpoutat III. světovou :D

Nahoru Odpovědět 2.5.2013 18:02
Creating websites is awesome till you see the result in another browser ...
Avatar
Petr Nymsa
Redaktor
Avatar
Odpovídá na Jiří Gracík
Petr Nymsa:

Tohle je takový menší boj :) A ještě vcelku se dobře čte :D ... ale možná by moderátoři potom mohli začít hlídat :P

Nahoru Odpovědět  +1 2.5.2013 18:04
Pokrok nezastavíš, neusni a jdi s ním vpřed
Avatar
Jiří Gracík
Redaktor
Avatar
Jiří Gracík:

Ale aspoň zase vím něco víc :)

Nahoru Odpovědět 2.5.2013 18:05
Creating websites is awesome till you see the result in another browser ...
Avatar
Kit
Redaktor
Avatar
Odpovídá na Jiří Gracík
Kit:

A to nám říkáš jen tak se zapnutým laserovým mečem v ruce? :)

Tohle přece není válka, jen si vyměňujeme zkušenosti s optimalizací.

Nahoru Odpovědět  +1 2.5.2013 18:05
Vlastnosti objektů by neměly být veřejné. A to ani prostřednictvím getterů/setterů.
Avatar
Jiří Gracík
Redaktor
Avatar
Odpovídá na Kit
Jiří Gracík:

Já to používám jako lucernu :`

Nahoru Odpovědět  +1 2.5.2013 18:08
Creating websites is awesome till you see the result in another browser ...
Avatar
Odpovídá na Kit
Luboš Běhounek (Satik):

Těmi instrukcemi nahrazujícími cyklus jsi myslel třeba REP, REPE a REPNE instrukce?
Jen škoda, že se nedají moc využít třeba pro hledání v UTF8 :)
A ani nevím, jaký je u nich rozdíl v rychlosti oproti běžnému cyklu, někdy to budu muset zkusit :)

Jinak kompilátorů je spousta, třeba ten od intelu je docela rychlý.

A ono pak už i záleží na procesoru, protože různé instrukce na různých procesorech trvají různě dlouho (i když ty počty cyklů jsou většinou dost podobné) a jak psal Kit, občas záleží i na pořadí instrukcí (třeba kvůli latenci paměti).

Editováno 2.5.2013 18:38
Nahoru Odpovědět 2.5.2013 18:36
:)
Avatar
Odpovídá na Lukáš Hruda (Luckin)
Luboš Běhounek (Satik):

Vecer na to kouknu, ted jsem jeste v praci a dorazil ted sef :D

libcosenior: tak to predelal do OpenGL :)

kit: optimalizací bych se nebál, kompilátor většinou ví, co dělá :)
Jinak u cyklů se z optimalizací (kromě řídící proměnné v registru u cyklů, kde není moc kódu v těle cyklu) ještě často používá unrolling, čímž se snižuje režie cyklu.

Nahoru Odpovědět 2.5.2013 18:46
:)
Avatar
Odpovídá na Lukáš Hruda (Luckin)
Luboš Běhounek (Satik):

Už na to koukám, v obou případech se celý cyklus zkompiluje do jedné instrukce REP STOS (protože celé pole plníš konstantou), ještě kouknu, proč je vector rychlejší.

Nahoru Odpovědět 2.5.2013 19:18
:)
Avatar
Odpovídá na Luboš Běhounek (Satik)
Lukáš Hruda (Luckin):

Zkoušel jsem takhle naplnit i objekt vlastní třídy pro práci s poli, trvalo to stejně dlouho jako u pole nebo byl ten rozdíl naprosto minimální, a to ta moje třída ještě kontroluje, zda index není mimo hranice pole.

 
Nahoru Odpovědět 2.5.2013 19:51
Avatar
Odpovídá na Lukáš Hruda (Luckin)
Luboš Běhounek (Satik):

Problém je v cache.

Při vytváření vectoru se hodnoty jeho prvků inicializují, takže se na ně šahá a jsou nacachované (nejen cache procesoru, ale hlavně jsou při tom namapované i stránky ve virtuální paměti, takže nedochází k neplatnosti stránky (page fault)).

Řešením je pak buďto na hodnoty pole před testem nějak šáhnout (třeba inicializovat hodnoty cyklem) nebo je možné hned při deklaraci, místo

int* arr = new int[size];

použít

int* arr = new int[size]();

Pak už je pole stejně rychlé jako vector.

A jinak co jsem si s tím zkoušel hrát, tak pokud bys místo konstantní hodnoty přiřazoval něco jiného, tak když je to možné, tak se to kompilátor (namísto REP STOS instrukce) snaží urychlit přes MMX instrukce.

Nahoru Odpovědět 2.5.2013 20:02
:)
Avatar
Martin Dráb
Redaktor
Avatar
Martin Dráb:

Ono z cykly jde, co se týče optimalizace, dělat spoustu věcí. Záleží také na tom, jaké možnosti dává k dispozici procesor: například zda disponuje nějakými instrukcemi pro vektorové počítání atd. Cyklus pak lze například nahradit menším počtem vektorových instrukcí, rozvinout tak, že jedna iterace nového provádí více iterací cyklu originálního. Když překladač vidí několik vnořených cyklů a zjistí, že přerovnání operací prováděných v tom nejvnitřnějším nenej nezpůsobí nežádoucí vedlejší účinky, ale také lépe rozloží závislosti jednotlivých operací, může klidně prohodit pořadí zanoření cyklů.

Těch optimalizací je dost a netýkají se jenom cyklů. Záleží ale na programovacím jazyce (čím toho víc umí, tím hůře), procesoru a nastavení překladače. Například prohazování vnitřního a vnějšího cyklu jsem viděl i v praxi. S vektorizací jsem si nikdy moc nehrál, nějak se mi nepodařilo Visual Studio příslušně nastavit.

Jinak umisťování proměnné do registru může znamenat problémy v případě, že k ní aplikace přistupuje z více vláken souběžně. Což samozřejmě za předpokladu, že aktuální hodnota proměnné se nenachází v paměti, ale v registru, nedává správné výsledky.

Někdy může být zajímavé se podívat, jakým způsobem jsou implementovány funkce jako memset či memmove. Člověk by řekl, že to udělají jedním cyklem, ale například na x64 mají tyhle rutiny větší množství verzí, které se aplikují v závislosti na tom, kolik bajtů se kopíruje/přepisuje. A používají instrukce, které jsem předtím nikde neviděl :-).

Nahoru Odpovědět 2.5.2013 20:04
2 + 2 = 5 for extremely large values of 2
Avatar
Odpovídá na Luboš Běhounek (Satik)
Lukáš Hruda (Luckin):

int* arr = new int[size]();
Tohle mi vyhodilo chybu - out of memory allocating 65536 bytes

 
Nahoru Odpovědět 2.5.2013 20:13
Avatar
Odpovídá na Lukáš Hruda (Luckin)
Luboš Běhounek (Satik):

V čem to kompiluješ?
A kolik máš volné RAMky?
Mě to běží v pohodě, zabírá to asi 800 MB.

Nahoru Odpovědět 2.5.2013 20:16
:)
Avatar
Odpovídá na Luboš Běhounek (Satik)
Lukáš Hruda (Luckin):

Dev-C++, ramky mam dost, tu chybu hází už kompilátor, kdyby to bylo nedostatkem paměti, tak to spadne za běho, v tom případě new hází výjimku.

 
Nahoru Odpovědět 2.5.2013 20:21
Avatar
Odpovídá na Lukáš Hruda (Luckin)
Luboš Běhounek (Satik):

Hm, tak to ti asi nepomuzu, v Visual Studiu mi to bezi bez problemu, zkus se pohrabat nekde v nastaveni a zvysit limit pameti pro haldu, jestli neni defaultne nejaky nizsi, ale pak by bylo divny, ze ti to bez tech zavorek jelo.

Nahoru Odpovědět 2.5.2013 20:30
:)
Děláme co je v našich silách, aby byly zdejší diskuze co nejkvalitnější. Proto do nich také mohou přispívat pouze registrovaní členové. Pro zapojení do diskuze se přihlas. Pokud ještě nemáš účet, zaregistruj se, je to zdarma.

Zobrazeno 33 zpráv z 33.