Vydělávej až 160.000 Kč měsíčně! Akreditované rekvalifikační kurzy s garancí práce od 0 Kč. Více informací.
Hledáme nové posily do ITnetwork týmu. Podívej se na volné pozice a přidej se do nejagilnější firmy na trhu - Více informací.

Diskuze: Optimalizace (přesunutá diskuse)

Aktivity
Avatar
Odpovídá na David Hartinger
Neaktivní uživatel:2.5.2013 16:57

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

Odpovědět
2.5.2013 16:57
Neaktivní uživatelský účet
Avatar
David Hartinger
Vlastník
Avatar
Odpovídá na Neaktivní uživatel
David Hartinger:2.5.2013 16:58

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

Nahoru Odpovědět
2.5.2013 16:58
You are the greatest project you will ever work on.
Avatar
Lukáš Hruda
Tvůrce
Avatar
Odpovídá na David Hartinger
Lukáš Hruda:2.5.2013 16:59

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
Tvůrce
Avatar
Odpovídá na Neaktivní uživatel
Kit:2.5.2013 17:01

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 Hartinger
Vlastník
Avatar
Odpovídá na Lukáš Hruda
David Hartinger:2.5.2013 17:13

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
You are the greatest project you will ever work on.
Avatar
David Hartinger
Vlastník
Avatar
Odpovídá na Kit
David Hartinger:2.5.2013 17:15

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
You are the greatest project you will ever work on.
Avatar
Odpovídá na Neaktivní uživatel
Luboš Běhounek Satik:2.5.2013 17:22

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
https://www.facebook.com/peasantsandcastles/
Avatar
Lukáš Hruda
Tvůrce
Avatar
Odpovídá na David Hartinger
Lukáš Hruda:2.5.2013 17:26

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
Odpovídá na David Hartinger
Zdeněk Pavlátka:2.5.2013 17:33

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
Tvůrce
Avatar
Odpovídá na David Hartinger
Kit:2.5.2013 17:33

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
Lukáš Hruda
Tvůrce
Avatar
Odpovídá na Zdeněk Pavlátka
Lukáš Hruda:2.5.2013 17:37

Používám Allegro 4.

 
Nahoru Odpovědět
2.5.2013 17:37
Avatar
Odpovídá na Luboš Běhounek Satik
Libor Šimo (libcosenior):2.5.2013 17:39

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
Lukáš Hruda
Tvůrce
Avatar
Odpovídá na Kit
Lukáš Hruda:2.5.2013 17:43

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):2.5.2013 17:43

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

Nahoru Odpovědět
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:2.5.2013 17:46

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
https://www.facebook.com/peasantsandcastles/
Avatar
Odpovídá na Lukáš Hruda
Luboš Běhounek Satik:2.5.2013 17:48

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
https://www.facebook.com/peasantsandcastles/
Avatar
Kit
Tvůrce
Avatar
Odpovídá na Lukáš Hruda
Kit:2.5.2013 17:54

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
Neaktivní uživatel:2.5.2013 18:02

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

Nahoru Odpovědět
2.5.2013 18:02
Neaktivní uživatelský účet
Avatar
Petr Nymsa
Tvůrce
Avatar
Odpovídá na Neaktivní uživatel
Petr Nymsa:2.5.2013 18:04

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
2.5.2013 18:04
Pokrok nezastavíš, neusni a jdi s ním vpřed
Avatar
Neaktivní uživatel:2.5.2013 18:05

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

Nahoru Odpovědět
2.5.2013 18:05
Neaktivní uživatelský účet
Avatar
Kit
Tvůrce
Avatar
Odpovídá na Neaktivní uživatel
Kit:2.5.2013 18:05

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
2.5.2013 18:05
Vlastnosti objektů by neměly být veřejné. A to ani prostřednictvím getterů/setterů.
Avatar
Odpovídá na Kit
Neaktivní uživatel:2.5.2013 18:08

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

Nahoru Odpovědět
2.5.2013 18:08
Neaktivní uživatelský účet
Avatar
Odpovídá na Kit
Luboš Běhounek Satik:2.5.2013 18:36

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
https://www.facebook.com/peasantsandcastles/
Avatar
Odpovídá na Lukáš Hruda
Luboš Běhounek Satik:2.5.2013 18:46

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
https://www.facebook.com/peasantsandcastles/
Avatar
Odpovídá na Lukáš Hruda
Luboš Běhounek Satik:2.5.2013 19:18

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
https://www.facebook.com/peasantsandcastles/
Avatar
Lukáš Hruda
Tvůrce
Avatar
Odpovídá na Luboš Běhounek Satik
Lukáš Hruda:2.5.2013 19:51

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
Luboš Běhounek Satik:2.5.2013 20:02

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
https://www.facebook.com/peasantsandcastles/
Avatar
Martin Dráb
Tvůrce
Avatar
Martin Dráb:2.5.2013 20:04

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
Lukáš Hruda
Tvůrce
Avatar
Odpovídá na Luboš Běhounek Satik
Lukáš Hruda:2.5.2013 20:13

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
Luboš Běhounek Satik:2.5.2013 20:16

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
https://www.facebook.com/peasantsandcastles/
Avatar
Lukáš Hruda
Tvůrce
Avatar
Odpovídá na Luboš Běhounek Satik
Lukáš Hruda:2.5.2013 20:21

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
Luboš Běhounek Satik:2.5.2013 20:30

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
https://www.facebook.com/peasantsandcastles/
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.