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
|
Zaslal: 30. březen 2012, 07:06:03 Předmět: Re: MNA PRE ZMENU VYTOCILO Visual Studio 2008 |
|
|
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 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. 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 |
|
 |
manutara

Založen: 02. 01. 2012 Příspěvky: 81 Bydliště: Kosice SVK
|
Zaslal: 30. březen 2012, 07:58:12 Předmět: |
|
|
jj ten gettickcount poznam, pouzivam na spomalovanie programu aby bezal
rovnako na nie rovnako rychlych pocitacoch 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 |
|
 |
Marek

Založen: 28. 07. 2007 Příspěvky: 1782 Bydliště: Velká Morava
|
Zaslal: 30. březen 2012, 13:36:37 Předmět: |
|
|
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 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 |
|
 |
manutara

Založen: 02. 01. 2012 Příspěvky: 81 Bydliště: Kosice SVK
|
Zaslal: 30. březen 2012, 14:23:50 Předmět: |
|
|
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''
nic to LOL aj tak ostanem pri tom cecku este nejaky cas
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  _________________ hadam to OpenGL este par rokov prezije |
|
Návrat nahoru |
|
 |
igor

Založen: 28. 07. 2007 Příspěvky: 196
|
Zaslal: 30. březen 2012, 14:32:52 Předmět: |
|
|
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 |
|
 |
manutara

Založen: 02. 01. 2012 Příspěvky: 81 Bydliště: Kosice SVK
|
Zaslal: 30. březen 2012, 14:46:50 Předmět: |
|
|
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 |
|
 |
igor

Založen: 28. 07. 2007 Příspěvky: 196
|
Zaslal: 30. březen 2012, 15:08:26 Předmět: |
|
|
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 |
|
 |
manutara

Založen: 02. 01. 2012 Příspěvky: 81 Bydliště: Kosice SVK
|
Zaslal: 30. březen 2012, 15:45:25 Předmět: |
|
|
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 |
|
 |
Vilem Otte

Založen: 18. 09. 2007 Příspěvky: 462 Bydliště: Znojmo - Sedlesovice, Kravi Hora
|
Zaslal: 30. březen 2012, 16:19:40 Předmět: |
|
|
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 . 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 |
|
 |
Crypton

Založen: 14. 05. 2009 Příspěvky: 306 Bydliště: The Void
|
Zaslal: 30. březen 2012, 20:09:53 Předmět: |
|
|
@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.
Č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.
 _________________
 |
|
Návrat nahoru |
|
 |
Marek

Založen: 28. 07. 2007 Příspěvky: 1782 Bydliště: Velká Morava
|
Zaslal: 30. březen 2012, 22:00:58 Předmět: |
|
|
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 . 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 |
|
 |
Al
Založen: 23. 10. 2007 Příspěvky: 196
|
Zaslal: 3. duben 2012, 04:51:26 Předmět: |
|
|
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 |
|
 |
Tringi

Založen: 28. 07. 2007 Příspěvky: 290
|
Zaslal: 3. duben 2012, 07:35:23 Předmět: |
|
|
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 |
|
 |
|