.[ ČeskéHry.cz ].
Visual Studio 2010 mě vytočilo
Jdi na stránku Předchozí  1, 2, 3, 4
 
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
micky



Založen: 28. 02. 2008
Příspěvky: 348
Bydliště: Plzeň, Praha

PříspěvekZaslal: 30. březen 2012, 07:06:03    Předmět: Re: MNA PRE ZMENU VYTOCILO Visual Studio 2008 Odpovědět s citátem

manutara napsal:
zdravim,

tak mna pre zmenu vytocilo visual studio 2008 ee. nejak som sa vcera na
nete dohrabal k bitwise operaciam tak reku napisem si konverter z desiatkovej
do binarnej sustavy. C, RELEASE MODE. zakladna idea bola nepouzit to delenie
2 lebo kazdy predsa vie, ze delenie je pomale. prva verzia pouziva NOT
+AND+XOR na prevod, druha verzia iba AND, prva aj druha SHIFT RIGHT
mno a tretia verzia delenie 2. vysledky su asi take

kód:

1) NOT+AND+XOR           ~ 45s
2) AND                   ~ 45s
3) DIV                   ~ 45s


merane hodinkami na rukach Wink konvertovalo to cisla od 1 do 9 999 999.
poznanie, programujte ako chcete, vymyslajte co chcete, kompilator si to
aj tak zoptimalizuje hehe. alebo som az taky babrak??


Jistěže to v release modu optimalizuje. Dá se to vypnout, ale tak proč, že ano. Smile Stejnak je ale dobré na optimalizace nespoléhat a úzkých hrdlech psát opravdu co nejoptimálněji. No, slova optimalizace bylo už snad dost.

Btw, 45 sekund... kolik těch čísel bylo?

Btw btw, jsou i přesnější způsoby měření než stopky v ruce, při takhle velkých časech se dá slušně upotřebit například úplně jednoduchá funkce GetTickCount (vrací milisekundy od spuštění systému s přesností něco okolo 12 ms, viz manuál na msdn).
_________________
https://www.bluepulsar.cz/
https://twitter.com/11thDream_Game/
Návrat nahoru
Zobrazit informace o autorovi Odeslat soukromou zprávu
manutara



Založen: 02. 01. 2012
Příspěvky: 81
Bydliště: Kosice SVK

PříspěvekZaslal: 30. březen 2012, 07:58:12    Předmět: Odpovědět s citátem

jj ten gettickcount poznam, pouzivam na spomalovanie programu aby bezal
rovnako na nie rovnako rychlych pocitacoch Wink tu som to nepouzil, pretoze
som tam nahodil 10 000 000 cisiel a pri desiatkach sekund to uz stacia aj tie
hodinky na priblizne urcenie.
_________________
hadam to OpenGL este par rokov prezije
Návrat nahoru
Zobrazit informace o autorovi Odeslat soukromou zprávu
Marek



Založen: 28. 07. 2007
Příspěvky: 1782
Bydliště: Velká Morava

PříspěvekZaslal: 30. březen 2012, 13:36:37    Předmět: Odpovědět s citátem

manutara napsal:
zdravim,

tak mna pre zmenu vytocilo visual studio 2008 ee. nejak som sa vcera na
nete dohrabal k bitwise operaciam tak reku napisem si konverter z desiatkovej
do binarnej sustavy. C, RELEASE MODE. zakladna idea bola nepouzit to delenie
2 lebo kazdy predsa vie, ze delenie je pomale. prva verzia pouziva NOT
+AND+XOR na prevod, druha verzia iba AND, prva aj druha SHIFT RIGHT
mno a tretia verzia delenie 2. vysledky su asi take

kód:

1) NOT+AND+XOR           ~ 45s
2) AND                   ~ 45s
3) DIV                   ~ 45s


merane hodinkami na rukach Wink konvertovalo to cisla od 1 do 9 999 999.
poznanie, programujte ako chcete, vymyslajte co chcete, kompilator si to
aj tak zoptimalizuje hehe. alebo som az taky babrak??

Zkus se podívat, co ti tam compiler vygeneroval za assembler. Taky se ti tam může projevit režie cyklení a těch tvých pár instrukcí se tam může ztratit.

V zásadě nemá moc smysl optimalizovat před tím, než víš, co bude jak pomalý. Samozřejmě pokud předem nějak dokážeš, že tvůj přístup bude v průměrném případě rychlejší než nějaký naivní, a zároveň dokážeš, že to bude v průměrném případě častým úským místem, tak má smysl rovnou napsat tu optimální variantu. Jinak to moc smysl nemá a je lepší to napsat co nejjednodušeji a optimalizovat pak podle toho, co ukáže profiler. Samozřejmě snažit se minimalizovat počet instrukcí jedné operace je mikrooptimalizace a to většinou moc nemá smysl dělat, ale to asi víš.
_________________
AMD Open Source Graphics Driver Developer
Návrat nahoru
Zobrazit informace o autorovi Odeslat soukromou zprávu
manutara



Založen: 02. 01. 2012
Příspěvky: 81
Bydliště: Kosice SVK

PříspěvekZaslal: 30. březen 2012, 14:23:50    Předmět: Odpovědět s citátem

citace:

Zkus se podívat, co ti tam compiler vygeneroval za assembler. Taky se ti tam může projevit režie cyklení a těch tvých pár instrukcí se tam může ztratit.

V zásadě nemá moc smysl optimalizovat před tím, než víš, co bude jak pomalý. Samozřejmě pokud předem nějak dokážeš, že tvůj přístup bude v průměrném případě rychlejší než nějaký naivní, a zároveň dokážeš, že to bude v průměrném případě častým úským místem, tak má smysl rovnou napsat tu optimální variantu. Jinak to moc smysl nemá a je lepší to napsat co nejjednodušeji a optimalizovat pak podle toho, co ukáže profiler. Samozřejmě snažit se minimalizovat počet instrukcí jedné operace je mikrooptimalizace a to většinou moc nemá smysl dělat, ale to asi víš.


neslo mi o optimalizaciu, nieje to ani kriticky bod niecoho vacsieho. len
taka hracka, chcel som vidiet co urobi kompilator so zdrojakom co mu dam.
podla mojho nazoru a vysledkov sa s tym vie kompilator dobre pohrat.
co sa tyka zlozitejsich problemov tam uz si niesom taky isty ako by to
zvladol, ale v principe pri rozlozeni na drobne kompilator urobi velku
cast optimalizacie za programatora.

co mi pripomina, ze mi to zobralo vietor z plachiet proti ``jave'' Very Happy Very Happy Very Happy
nic to LOL aj tak ostanem pri tom cecku este nejaky cas Wink

P.S. aby to nevyzeralo, ze som uplny ``lepl'' tych 45 sekund je tam preto
lebo v algoritme je vypis do suboru, cize priblizne 350milion krat sa tam
vola fprintf hehe, na druhej strane to aspon dost spomalilo program, pri
nezapisovani do suboru to prebehne tak, ze to gettickcount() nerozozna, cize
pod tych 12ms Wink
_________________
hadam to OpenGL este par rokov prezije
Návrat nahoru
Zobrazit informace o autorovi Odeslat soukromou zprávu
igor



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

PříspěvekZaslal: 30. březen 2012, 14:32:52    Předmět: Odpovědět s citátem

Ugh... a jakou má pak těch 45 sekund vypovídací hodnotu, když čas výpočtu je úplně zanedbatelný a těch 45 sekund zabere výpis do souboru, který probíhá pro každou variantu stejně? Nebo jsem něco špatně pochopil? Jinak můžeš taky použit high-resolution timer.
Návrat nahoru
Zobrazit informace o autorovi Odeslat soukromou zprávu
manutara



Založen: 02. 01. 2012
Příspěvky: 81
Bydliště: Kosice SVK

PříspěvekZaslal: 30. březen 2012, 14:46:50    Předmět: Odpovědět s citátem

citace:

Ugh... a jakou má pak těch 45 sekund vypovídací hodnotu, když čas výpočtu je úplně zanedbatelný a těch 45 sekund zabere výpis do souboru, který probíhá pro každou variantu stejně? Nebo jsem něco špatně pochopil? Jinak můžeš taky použit high-resolution timer.


asi taku, ze samotne vypocty su v principe rovnako rychle. ak by to bolo
pre zopar cisel potom by to mohlo zavadzat, ale pri 10mil je podla toho
jedno ci delim dvomi, alebo pouzijem AND. pred chvilou som sa s tym este
chvilu hral, DIV a AND varianty, 50 iteracii pri 1mld cisel bez vypisu, opat
to gettickcount() nerozozna, to su milisekundove rozdiely. s high-res sa
mozno pohram neskor.

EDIT:
tak uz naposledy a nebudem otravovat, mensie upravy a tu su vysledky

kód:

50 iteracii na 1 milion cisel
AND ~ 23.4ms
DIV ~ 24.3ms


pouzite GetTickCount(), spriemerovane.
_________________
hadam to OpenGL este par rokov prezije


Naposledy upravil manutara dne 30. březen 2012, 15:10:19, celkově upraveno 1 krát
Návrat nahoru
Zobrazit informace o autorovi Odeslat soukromou zprávu
igor



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

PříspěvekZaslal: 30. březen 2012, 15:08:26    Předmět: Odpovědět s citátem

Stále nechápu, přece přidáním výpisu tu rozlišovací schopnost vůbec nijak nezvýšíš (právě naopak) a do toho testu zanášíš věci, které vůbec testovat nechceš. Těch tvých neuchopitelných pár ms se u toho výpisu ztratí nesrovnatelně víc, než při čistém výpočtu a samotný výpočet je v takovém testu vedle výpisu úplně zanedbatelná operace.

To je jako bys měl problém na stopkách změřit, z které pistole rychleji zasáhneš cíl a vyřešil to tak, že ten cíl dáš 50 km daleko a střelec k němu musí doběhnout.

Buď těch čistých výpočtů bez výpisu udělej víc tak, abys mohl rozdíl pod těch 12 ms prohlásit za zanedbatelný nebo použij ten high resolution timer, ideálně oba. Dávej pozor, aby ty výpočty kompilátor úplně neodstranil, což může udělat, když mu je jasné, že se ty výsledky nikde nepoužívají.
Návrat nahoru
Zobrazit informace o autorovi Odeslat soukromou zprávu
manutara



Založen: 02. 01. 2012
Příspěvky: 81
Bydliště: Kosice SVK

PříspěvekZaslal: 30. březen 2012, 15:45:25    Předmět: Odpovědět s citátem

igor napsal:
Stále nechápu, přece přidáním výpisu tu rozlišovací schopnost vůbec nijak nezvýšíš (právě naopak) a do toho testu zanášíš věci, které vůbec testovat nechceš. Těch tvých neuchopitelných pár ms se u toho výpisu ztratí nesrovnatelně víc, než při čistém výpočtu a samotný výpočet je v takovém testu vedle výpisu úplně zanedbatelná operace.

To je jako bys měl problém na stopkách změřit, z které pistole rychleji zasáhneš cíl a vyřešil to tak, že ten cíl dáš 50 km daleko a střelec k němu musí doběhnout.

Buď těch čistých výpočtů bez výpisu udělej víc tak, abys mohl rozdíl pod těch 12 ms prohlásit za zanedbatelný nebo použij ten high resolution timer, ideálně oba. Dávej pozor, aby ty výpočty kompilátor úplně neodstranil, což může udělat, když mu je jasné, že se ty výsledky nikde nepoužívají.


rozumiem co chces povedat, ja som ani nemal umysel prehlasit, ze toto je
rychlejsie, alebo, ze vsetky varianty su rovnake. zacalo to konvertorom
pre osembitove cislo, preslo to na 4 bajtovy int potom na milion cisel,
tri varianty a tak som sa bavkal. neber to nejak vazne, su tu isto lepsi
experti na taketo veci. len ma trosku prekvapilo, ze to trva ~rovnako dlho.
po pravde som cakal vacsie rozdieli, ale ako uz bolo spomenute pri takychto
ulohach uz ista mikrooptimalizacia na urovni instukcii, ci tri, alebo jedna
nema velmi zmysel kedze samotny kompilator to upravy tak ako je to
``najlepsie''.

k tomu, ze tam mam fprintf, mno ciel bol taky, ze prekonvertovane cisla
zapisem do suboru, nechcel som samotny algoritmus len pre algoritmus.
cize ak jedna varianta spocita a zapise za 45 sekund a druha za 30 tak je
to jasne, ale kedze vsetky tri to urobia za ~45 sekund nieje o com.
_________________
hadam to OpenGL este par rokov prezije
Návrat nahoru
Zobrazit informace o autorovi Odeslat soukromou zprávu
Vilem Otte



Založen: 18. 09. 2007
Příspěvky: 462
Bydliště: Znojmo - Sedlesovice, Kravi Hora

PříspěvekZaslal: 30. březen 2012, 16:19:40    Předmět: Odpovědět s citátem

You're doing it wrong!

Za prvé, používat na časování GetTickCount je špatný vtip (ono obecně GetTickCount raději nepoužívat vůbec), zkus raději QueryPerformanceCounter a QueryPerformanceFrequency - jsou přesnější.

Navíc, těch prvků máš málo - budeš jich potřebovat nejméně několik miliard, abys skutečně něco změřil.

Early optimalizace ti stejně nepomůže, raději to prvně napiš a poté použij profiler Wink. Pak má smysl optimalizovat, protože budeš vědět kde!
_________________
Should array indices start at 0 or 1? My compromise of 0.5 was rejected without, I thought, proper consideration.
Návrat nahoru
Zobrazit informace o autorovi Odeslat soukromou zprávu Odeslat e-mail Zobrazit autorovi WWW stránky
Crypton



Založen: 14. 05. 2009
Příspěvky: 306
Bydliště: The Void

PříspěvekZaslal: 30. březen 2012, 20:09:53    Předmět: Odpovědět s citátem

@manutara: Takové mikrooptimalizace provádí "většina" C/C++ překladačů automaticky, a to i někdy v debug buildu, bez zapnuté optimalizace. Takže je zcela zbytečné vůbec něco takového zkoušet, pokud tedy ale nepíšeš svůj vlastní překladač.

Mimochodem, asi před týdnem jsem se "šťoural" v binárkách hry Arcanum (která byla vydaná s binárkami z debug buildu namísto těch z release verze), a všimnul jsem si, že tam jsou úplně šílené mikrooptimalizace (na tu dobu, tj. rok 2000). Tak třeba násobení je tam hodně často rozděleno na několik sčítaní, a dělení zase na několik odčítání a sčítání, apod. Jsou tam taky optimalizace s tabulkami switchem, a taky nějaké unrolled loopy (ale to na 90% neudělal ten překladač). A to radši ani nemluvím o té brutálně optimalizované memcpy funkci. Twisted Evil

Člověk by čekal, že za tu dobu ty dnešní překladače musí být na tolik odladěné a "chytré", že nebudou mít problém vygenerovat "perfektně" optimalizovanou binárku. Někdy ale narazím na nějaký kus kódu (ať už ve svých, či cizích binárkách), který je ale úplně a totálně zprasený... kouknu na verzi překlače, a zjistím třeba že to není ani dva roky stará verze.

Rolling Eyes
_________________
Návrat nahoru
Zobrazit informace o autorovi Odeslat soukromou zprávu Zobrazit autorovi WWW stránky
Marek



Založen: 28. 07. 2007
Příspěvky: 1782
Bydliště: Velká Morava

PříspěvekZaslal: 30. březen 2012, 22:00:58    Předmět: Odpovědět s citátem

Crypton napsal:
Člověk by čekal, že za tu dobu ty dnešní překladače musí být na tolik odladěné a "chytré"

Překladače zas tak chytré nejsou. Mohou udělat lepší kód než ty, ale zrovna např C/C++ se strašně špatně optimalizuje. Pokud máš někde pointer a nad ním pracuješ, překladač neví, kde ten pointer může ukazovat a musí předpokládat, že může změnit jakoukoliv proměnnou kdekoliv (snad kromě nových lokálních proměnných). S tím moc neudělá a musí to přeložit tak, jak to tam je.

Vilem Otte napsal:
raději to prvně napiš a poté použij profiler Wink. Pak má smysl optimalizovat, protože budeš vědět kde!

Rozhodně nebude vědět kde. To je dost běžný problém lidí, co poprvé používají profiler, že tam uvidí funkci, kde se tráví nejvíc času a začnou optimalizovat zrovna tu funkci, místo aby se třeba podívali, proč se ta funkce volá tak často a jestli by nešlo jit volat méně častěji. Profiler ti neřekne, kde máš optimalizovat, on ti pouze řekne, kde se to projevuje. Na tobě je pak zjistit proč se to tam projevuje a až to budeš vědět, tak má smysl se zabývat tím, kde by se to dalo spravit.
_________________
AMD Open Source Graphics Driver Developer
Návrat nahoru
Zobrazit informace o autorovi Odeslat soukromou zprávu
Al



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

PříspěvekZaslal: 3. duben 2012, 04:51:26    Předmět: Odpovědět s citátem

Takže když to shrnu: Napíšeme 3x stejnej triviální program, co trvá 2 milisekundy, přidáme 44.998 sekund trvající výpis do souboru a pak to "změříme" na stopkách v ruce. A pak napíšeme dlouhý rozbor na téma "která instrukce je nejrychlejší" a budeme se na fóru bít za to, že jsme to udělali dobře. Wow!

QueryPerformanceCounter je fakt o dost lepší na měření času, ale stejně se tím nedají profilovat nějaké skoro stejně rychlé milisekundové věci, protože Windows má multitasking a on se taky zrovna může rozhodnout třeba spustit Windows Update a ty časy pak nemají vypovídací hodnotu žádnou... Takže bych to hlavně taky testoval na procesu s vyšší prioritou, spouštěl to víckrát zasebou a pokud ten výpočet není z principu ovlivněn keší (že by se jako díky cache hodně zrychlil při druhém a dalším průběhu), vezmu ten nejkratěí čas jako výslednou hodnotu (rozhodně ne průměr, jak to lidi často dělají). A hlavně bych nikdy nedělal pokusy na takových umělých příkladech, kde to nemá žádný význam pro praxi. (Pokud nebereme za význam to, že se člověk ztrapní na fóru, když předvede, jak to měřil, protože i kdyby to náhodou člověk dělal celkem dobře, vždycky přijde eněkdo, kdo umí změřit ještě přesněji.)

A mimochodem s profilerem ve Visual Studiu nemám dobré zkušenosti. Opět teda jsou to zkušenosti z dávných let, ale tak nějak většinou víc vím o svým zdrojáku sám, než co mi prozradí tupý profiler. Přesně jak psal Marek, člověk stejně musí rozumět, co se v tom programu děje.
Návrat nahoru
Zobrazit informace o autorovi Odeslat soukromou zprávu
Tringi



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

PříspěvekZaslal: 3. duben 2012, 07:35:23    Předmět: Odpovědět s citátem

Aneb abych parafrázoval známé rčení: "pověz mi jak měříš výkon a já ti řeknu jaký druh blbce jsi."
_________________
WWW | GitHub | TW
Návrat nahoru
Zobrazit informace o autorovi Odeslat soukromou zprávu Zobrazit autorovi WWW stránky
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 Předchozí  1, 2, 3, 4
Strana 4 z 4

 
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