🚀 go-pugleaf

RetroBBS NetNews Server

Inspired by RockSolid Light RIP Retro Guy

Article View: pl.comp.lang.c
Article #310047

Re: Optymalizacja kodu

#310047
From: (fir)
Date: Sun, 29 Dec 2019 11:20
190 lines
13858 bytes
W dniu niedziela, 29 grudnia 2019 06:36:04 UTC+1 użytkownik M.M. napisał:
> On Sunday, December 29, 2019 at 5:50:35 AM UTC+1, (fir) wrote:
> > W dniu niedziela, 29 grudnia 2019 05:38:56 UTC+1 użytkownik M.M. napisał:
> > > On Saturday, December 28, 2019 at 12:12:07 PM UTC+1, (fir) wrote:
> > > > W dniu sobota, 28 grudnia 2019 12:11:16 UTC+1 użytkownik (fir) napisał:
> > > > > W dniu sobota, 28 grudnia 2019 11:58:53 UTC+1 użytkownik (fir) napisał:
> > > > > > W dniu sobota, 28 grudnia 2019 11:52:58 UTC+1 użytkownik (fir) napisał:
> > > > > > > W dniu sobota, 28 grudnia 2019 11:50:11 UTC+1 użytkownik M.M. napisał:
> > > > > > > > On Saturday, December 28, 2019 at 10:26:57 AM UTC+1, (fir) wrote:
> > > > > > > > > W dniu sobota, 28 grudnia 2019 10:11:26 UTC+1 użytkownik (fir) napisał:
> > > > > > > > > > W dniu sobota, 28 grudnia 2019 03:44:41 UTC+1 użytkownik M.M. napisał:
> > > > > > > > > > > On Friday, December 27, 2019 at 10:01:25 PM UTC+1, (fir) wrote:
> > > > > > > > > > > > W dniu piątek, 27 grudnia 2019 21:54:14 UTC+1 użytkownik M.M. napisał:
> > > > > > > > > > > > > On Friday, December 27, 2019 at 8:18:46 PM UTC+1, (fir) wrote:
> > > > > > > > > > > > > > W dniu piątek, 27 grudnia 2019 20:12:09 UTC+1 użytkownik M.M. napisał:
> > > > > > > > > > > > > > > On Friday, December 27, 2019 at 7:48:22 PM UTC+1, (fir) wrote:
> > > > > > > > > > > > > > > > a co z dezasemblacja? to calkiem proste a wiele by wyjasnilo
> > > > > > > > > > > > > > > 
> > > > > > > > > > > > > > > Jest kilka problemów z tym. Nie znam zasad łączenia instrukcji w pary/trójki 
> > > > > > > > > > > > > > > żeby procesor mógł je wykonać równocześnie, o czasach wykonania nie wspomnę.
> > > > > > > > > > > > > > > No i bym musiał procedurę zostawić w asemblerze, dopracować ją (czytaj: napisać
> > > > > > > > > > > > > > > lepiej niż kompilator) i utrzymywać w asemblerze. Wiec nawet jak znajdę
> > > > > > > > > > > > > > > wyjaśnienie, to chyba nic mi z tego.
> > > > > > > > > > > > > > > 
> > > > > > > > > > > > > > > Pozdrawiam
> > > > > > > > > > > > > > 
> > > > > > > > > > > > > > chodzi o dezasemblacje i zobazenie co sie zmienilo miedzy ta wolniejsza a szybsza wersje a nie o pisanie asma (ktore nie jest zreszta wcale takie trudne mysle ze idzie sie nauczyc w dzien (choc sam nie pisalme jeszcze 64 bitowego asma)
> > > > > > > > > > > > > 
> > > > > > > > > > > > > Zgodzę się, że dla kogoś kto biegle zna i używa asemblera na 386, byłby to
> > > > > > > > > > > > > dobry przykład jak należy, a jak nie należy pisać wydajny kod w asemblerze.
> > > > > > > > > > > > > Ja piszę w C++, dla mnie wstawka jednej instrukcji w asemblerze (np. to
> > > > > > > > > > > > > popcount, xchange, rot) maksymalne użycie asemblera. Taki ktoś jak ja 
> > > > > > > > > > > > > chyba nie wyniesie z tego żadnej nauki?
> > > > > > > > > > > > > 
> > > > > > > > > > > > jak to nie - zdezasembluj a dostaniesz odpowiedz na swoje pytaie czemu jest szybciej..jak nie umiesz czytac asma to zapostuj go na grupie tylko trzeba by zdizasemblowac odpowiednie kawalki
> > > > > > > > > > > 
> > > > > > > > > > > Nie chciałem powiedzieć, że nie można się dowiedzieć z asemblera, tylko że jak
> > > > > > > > > > > się dowiem, to nie spożytkuję tej wiedzy w innych programach. Ale nie ma
> > > > > > > > > > > problemu, to tylko dodanie opcji -S do kompilatora:
> > > > > > > > > > > 
> > > > > > > > > > > https://pastebin.com/xriqX0SS
> > > > > > > > > > > 
> > > > > > > > > > > Które to kawałki - trudno powiedzieć. Może testy oddziela instrukcja:
> > > > > > > > > > > 
> > > > > > > > > > > movabsq	$6364136223846793005
> > > > > > > > > > > 
> > > > > > > > > > > Pozdrawiam
> > > > > > > > > > > 
> > > > > > > > > > > Pozdrawiam
> > > > > > > > > > 
> > > > > > > > > > potrzebujesz napisac test w minimalnej wersji w c (tak zeby nie nylo niepotrzebnych wywolan) po czym zdizasemblowac wlasnie ten kawalek
> > > > > > > > > > (najlepiej w tej normalnej skladni a nie w tej i z komentarzami)
> > > > > > > > > > 
> > > > > > > > > > tutaj ja bym znalazl latwo te kawalki ale nie je pisalem bazowy kod i nie mam go w pamieci (zwlaszcza ze jest napisany w durnym dla mnie c++) po co tu sa wywolywane te wywolania do marsenne twister mialo chodzic o oryginalny kod z loopami, ciezko mi zmapowac to na kod w c ktorego nie znam, choc generalnie widac ze jest jak kawa na lawe - jako ze pokazuje nazwy funkcji ktore wola wywolaj sobie cos o uniklanej nazwie na poczatklu i koncu kawalka i znajdz przec control+f w teksiecie
> > > > > > > > > > 
> > > > > > > > > > widac ze np jedna z oimawianych petli jest 
> > > > > > > > > > 
> > > > > > > > > > .L76:
> > > > > > > > > >     movl    28832(%rsp), %eax   # rndBuf.select, D.82123
> > > > > > > > > >     leal    1(%rax), %edx   #, tmp522
> > > > > > > > > >     testb   $1, %al #, D.82123
> > > > > > > > > >     movl    %edx, 28832(%rsp)   # tmp522, rndBuf.select
> > > > > > > > > >     jne .L138   #,
> > > > > > > > > >     movq    28824(%rsp), %rbp   # rndBuf.i2, D.82124
> > > > > > > > > >     cmpq    %r14, %rbp  # tmp566, D.82124
> > > > > > > > > >     je  .L139   #,
> > > > > > > > > > .L72:
> > > > > > > > > >     leaq    4(%rbp), %rax   #, tmp555
> > > > > > > > > >     movq    %rax, 28824(%rsp)   # tmp555, rndBuf.i2
> > > > > > > > > >     movl    0(%rbp), %eax   # *_756,
> > > > > > > > > >     addq    %rax, %r13  # D.82120, sum
> > > > > > > > > >     subq    $1, %r12    #, D.82120
> > > > > > > > > >     jne .L76    #,
> > > > > > > > > > .L137:
> > > > > > > > > > 
> > > > > > > > > > 
> > > > > > > > > > ale nei wiem dokladnie ktory to kawalek jak mowie trzeba to zdizasemblowac kawalkami i najlepiej napisac to w c wtedy widac co i jaki nie ma tez w tym nic trudnego tyle ze mi nieprzyjemnie jest debugowac czyjs kod na ktory nie moge patrzec bo jest w c++ i nie mam ogarniete jak on w calosci wyglaa
> > > > > > > > > 
> > > > > > > > > testowanie i optymalizowanie wymaga duzo przepisywania tak ze mysle ze kolega powinien byc gotow na rozbicie tych 5-ciu czy tam ile testow na 5 minimalnych kilkolinijkowcow w c i zdezasemblowanie ich
> > > > > > > > 
> > > > > > > > Nadal nie rozumiem jakie korzyści z analizy asemblera będę miał jako 
> > > > > > > > programista C++. Kiedyś byle jak napisana procedura w AMS działała 3
> > > > > > > > razy szybciej niż porządnie napisana w C i z 5 razy szybciej niż w C++.
> > > > > > > > Ale te czasy minęły, teraz trzeba bardzo dużo pracy włożyć aby czasami
> > > > > > > > pokonać kompilator o parę procent. Ja raczej bym chciał lepiej wiedzieć 
> > > > > > > > jak pisać w C++ aby kompilator generował efektywny kod przy zachowaniu 
> > > > > > > > chociaż minimalnej przejrzystości kodu i podatności na rozbudowę. 
> > > > > > > > 
> > > > > > > jaki korzysci? poprostu odpowiedz na kolegi pytanie dlazego tu jest wolniej a dlaczego szybciej - akurat ta odpowiedz warto sobie sprawdzic a nie jest to wcale duzo roboty 
> > > > > > > 
> > > > > > > gdyby ja to pisal sprawdzilbym sobie to mysle w ciagu 20 minut i bym po prostu wiedzial
> > > > > > 
> > > > > > co do tego przyspieszania o kilka procent to nie jestem taki pewien, mi samemu nie chce sie grzebac w asmie ale to zalezy od tego jaki wogole jest powod do optymalizacji (gdybym mial to bym zaczal pewnie na pisanie kodow przy pomocy skalarow lub intrinsicow ale ogladal tez kod w asmie)
> > > > > > 
> > > > > > ogolnie to jak pisalem sam nie robie teraz optymalizacji czyli tutaj bym wzial zwykle rand()%modulo ew napisal sobie w minute druga wersje z cache w postaci tablicy statycznej n elementow gdyby mi naprawde bardziej zalezalo
> > > > > > 
> > > > > > duzo wiekszym problemem w programowaniu jest dla mnie teraz kreatywnosc a nie optymalizacja - (ale nie neguuje ze warto sie jej nauczyc, warto jej tez uzywac tez nie neguje, tyle ze dla mnie osobiscie to nie jest ten moment)
> > > > > 
> > > > > 
> > > > > ew niech kolega napisze ze dwa te testy
> > > > > w czystym c w postaci jednego pliku c (moge byc bez funkcji miezenia czasu, sam rdzen sprawy
> > > > > 
> > > > > 
> > > > > test1() {.. }
> > > > > test2() {.. }
> > > > > 
> > > > > main()
> > > > > {
> > > > >   test1();
> > > > >   test2();
> > > > > }
> > > > > 
> > > > > to ew moge zdizasemblowac u siebie (co prawda to chyba bez sensu bo ja ciagle siedze na 32 bitowym xp (z wlasnego wyboru), a moj komp w win10 od lat w drugim pokoju porasta kurzem (i nie che mi sie na nim testowac bo musialbym przynosic odkurzac, przyzwyczajac sie do edytorow i okienek na zimniejszym w odczuciu systemie itd itd)
> > > > > 
> > > > > sama dizasemblacje z kolei lubie spozieranie w asma nie jest zle (dodam ze sam jestem tworca asemblera (org-asm, fajne bajery z tym asmem) sam sie zastanawiam czy nie warto by wrocic i w nim pogrzebac
> > > > 
> > > > aha w sumie to mozna zdizasemblowac online, ale wolalbym by kolega napisal ten kod w wersji c i mozemy zobaczyc
> > > 
> > > Przepraszam, ale moim zdaniem zainwestowany czas w naukę asemblera nie
> > > zwróci się. Z 20 lat temu się uczyłem asemblera, w komercyjnym programie
> > > wykorzystałem z może jeden raz w życiu, a autor książki mnie zapewniał, że
> > > osoby które nauczyły się asemblera nie żałują teraz tego :)
> > > 
> > ja nie zaluje...a czas sie zwroci bo jest to dosyc maly czas bo asm jest dosyc prosty... mozna np wziac moj asembler i w nim sie latwo pisze, latwe wejscie do asma imo (choc nie wklepalem wszystkich kombinacji rejestrow i mnemonikow)
> > 
> > post o asmie wrzucilem chyba ba pl.comp.programming z malym przykladem jak prosto mozna mierzyc dokladnie co do cykla ile trwaja wybrana fragmenty kodu w asmie
> 
> Niektórzy nie chcą pisać w C, niektórzy nawet w C++, bo za niskopoziomowy 
> język.
> 
to nie chodzi o pisanie w asmie a o sporadyczne bawienie sie w asmie by wiedziec jak cos doklednie dziala
(nie tylko ile cykli ma jaka komenda ale i kilka innych ciekawych rzeczy (ktore nie ogarniete moga powodowac godziny dni tygodnie i miesiace meki z poziomu c/c+) pojawia sie jak kawa na lawe)

polecam sie pobawic moim asmem bo sporo rzeczy moze sie wyjasnic,

 ja np dopiero ostatnio dowiedzialem sie jak przekazywane są float do printfa

tj jak zrobic

printf(" f = %f ",  123.456);

z poziomu asemblera

wie ktos ? ;c

s

p


o


i

l


y

trzeba cos w tym stylu

  @ f: double(123.456)
 //zapisz double wartosci 123.456 
// (8 bajtow) w sekcji data pod labelem f
// (moja skladnia do tego jest mzoe 
// troceh dziwna pozniej poprawie

   @ txt: " f = %f " 0
// zapisz string w sekcji data pod 
// labelem txt

  mov eax f
   add eax 4
   push (eax)
  mov eax f
   push (eax)
  push txt
    call msvcrt.printf
  pop eax
  pop eax
  pop eax

w asmie widac wszystko jak kawa na lawe 
tutaj w szczegolnosci ze floaty przekazuje sie do printfa jako double przez stos przez wartosc i to w takiej odwroconej kolejnosci (przynajmniej odwroconej wzgledem czegostam ;c)

asm zmusza kodera w c/c++ do nauczenia sie wszystkich waznych rzeczy i t zmusza go do nauczenia sie tego w kilka pierwszych dni i to nauczenia sie latwo


(dlatego polecam jeszze raz moj asm, nie kelepalem w nim jeszcze troche rzeczy ale jak ktos napisze na grupic o mu nie dziala to odpowiem i ew dokoduje te dorobne łatki)
Technical Details
Message-ID: <9764f0a6-c8aa-49b7-bdab-3a999917fe4f@googlegroups.com>
Path: mbox-mo1.pugleaf.net!news-archive.icm.edu.pl!news.icm.edu.pl!newsfeed.pionier.net.pl!3.eu.feeder.erje.net!feeder.erje.net!weretis.net!feeder7.news.weretis.net!proxad.net!feeder1-2.proxad.net!209.85.160.216.MISMATCH!g89no6175637qtd.0!news-out.google.com!w29ni485qtc.0!nntp.google.com!g89no6175634qtd.0!postnews.google.com!google-groups.googlegroups.com!not-for-mail
References: <ed3041b7-c05f-43f3-887a-9a12a9633741@googlegroups.com> <2104ea83-5daa-4752-9a63-ed3346a14082@googlegroups.com> <82f8e967-0d0e-4bae-b005-aacb301b2349@googlegroups.com> <aa15d34a-292a-42ed-86cd-146377009a51@googlegroups.com> <00ddf4f0-f30c-413a-bda9-2ecd442ad84a@googlegroups.com> <003763c5-828f-4181-980c-f01f81e2a2c8@googlegroups.com> <d9d3d2f0-277e-4fa8-846d-d0784f45bc93@googlegroups.com> <efadabbf-295a-4f56-a5bf-d69d7eb7647d@googlegroups.com> <e46f3a29-ca94-427d-b0e0-fa791a51fadf@googlegroups.com> <31b3375d-ef24-40d7-a6db-a41e0fe5ac23@googlegroups.com> <4a7c96ab-288a-4e9a-a9a1-70c78fd578a1@googlegroups.com> <02fdc426-45d4-42e3-98a5-23316f63d901@googlegroups.com> <a7cd6b49-8d33-4ba8-a506-3679dc90aa42@googlegroups.com> <6824054f-4422-4145-a455-95a2c0c8c1d7@googlegroups.com> <8a471524-4bc0-41e8-8864-776facb1e28b@googlegroups.com> <bf2ff43d-f61d-4bad-b9e6-a054ec276e2c@googlegroups.com> <d1bdb0ee-df2f-40d0-8a26-67ebed5b9157@googlegroups.com> <892b298e-2409-4440-8aa8-af76bb5fe2f4@googlegroups.com> <08e8bfe0-2afb-40a8-90ee-4e75bedfa4e0@googlegroups.com>

Show Full Headers
Complete Article Headers
X-Received: by 2002:aed:376a:: with SMTP id i97mr44606116qtb.44.1577618443711;        Sun, 29 Dec 2019 03:20:43 -0800 (PST)
X-Received: by 2002:a25:d70e:: with SMTP id o14mr45767048ybg.277.1577618443469; Sun, 29 Dec 2019 03:20:43 -0800 (PST)
Path: mbox-mo1.pugleaf.net!news-archive.icm.edu.pl!news.icm.edu.pl!newsfeed.pionier.net.pl!3.eu.feeder.erje.net!feeder.erje.net!weretis.net!feeder7.news.weretis.net!proxad.net!feeder1-2.proxad.net!209.85.160.216.MISMATCH!g89no6175637qtd.0!news-out.google.com!w29ni485qtc.0!nntp.google.com!g89no6175634qtd.0!postnews.google.com!google-groups.googlegroups.com!not-for-mail
Newsgroups: pl.comp.lang.c
Date: Sun, 29 Dec 2019 03:20:43 -0800 (PST)
In-Reply-To: <08e8bfe0-2afb-40a8-90ee-4e75bedfa4e0@googlegroups.com>
Complaints-To: groups-abuse@google.com
Injection-Info: google-groups.googlegroups.com; posting-host=5.172.255.208; posting-account=Sb6m8goAAABbWsBL7gouk3bfLsuxwMgN
NNTP-Posting-Host: 5.172.255.208
References: <ed3041b7-c05f-43f3-887a-9a12a9633741@googlegroups.com> <2104ea83-5daa-4752-9a63-ed3346a14082@googlegroups.com> <82f8e967-0d0e-4bae-b005-aacb301b2349@googlegroups.com> <aa15d34a-292a-42ed-86cd-146377009a51@googlegroups.com> <00ddf4f0-f30c-413a-bda9-2ecd442ad84a@googlegroups.com> <003763c5-828f-4181-980c-f01f81e2a2c8@googlegroups.com> <d9d3d2f0-277e-4fa8-846d-d0784f45bc93@googlegroups.com> <efadabbf-295a-4f56-a5bf-d69d7eb7647d@googlegroups.com> <e46f3a29-ca94-427d-b0e0-fa791a51fadf@googlegroups.com> <31b3375d-ef24-40d7-a6db-a41e0fe5ac23@googlegroups.com> <4a7c96ab-288a-4e9a-a9a1-70c78fd578a1@googlegroups.com> <02fdc426-45d4-42e3-98a5-23316f63d901@googlegroups.com> <a7cd6b49-8d33-4ba8-a506-3679dc90aa42@googlegroups.com> <6824054f-4422-4145-a455-95a2c0c8c1d7@googlegroups.com> <8a471524-4bc0-41e8-8864-776facb1e28b@googlegroups.com> <bf2ff43d-f61d-4bad-b9e6-a054ec276e2c@googlegroups.com> <d1bdb0ee-df2f-40d0-8a26-67ebed5b9157@googlegroups.com> <892b298e-2409-4440-8aa8-af76bb5fe2f4@googlegroups.com> <08e8bfe0-2afb-40a8-90ee-4e75bedfa4e0@googlegroups.com>
User-Agent: G2/1.0
MIME-Version: 1.0
Message-ID: <9764f0a6-c8aa-49b7-bdab-3a999917fe4f@googlegroups.com>
Subject: Re: Optymalizacja kodu
From: "(fir)" <profesor.fir@gmail.com>
Injection-Date: Sun, 29 Dec 2019 11:20:43 +0000
Content-Type: text/plain; charset=UTF-8
Content-Transfer-Encoding: 8bit