Article View: pl.comp.lang.asm
Article #2594Re: [1/3 NTG] C - Optymalizacje wstawkami
From: mezzogm
Date: Mon, 11 Feb 2019 15:56
Date: Mon, 11 Feb 2019 15:56
118 lines
5341 bytes
5341 bytes
> Nie, nie musi być, nawet pomijając mniej lub bardziej dziwne składnie.
> Można zawsze pisać swoje procedurki w osobnym pliku, kompilować
> osobno i dopiero linkować razem. Ale płaci się za to wywołaniem CALL,
> stosem itd.
Czyli, tradycyjnie - znaj proporcjum, mocium panie! ;-)
Nauka jest taka, że sens ma "owstawkowanie" W CAŁOŚCI bloków wydzielonych funkcjonalnie z programu (niekoniecznie w postaci osobnej procedury).
> Większość funkcji C działa na łańcuchach znaków kończących się bajtem
> zerowym, bo po prostu tak są zdefiniowane łańcuchy znaków w C.
long int strtol (const char* str, char** endptr, int base)
double strtod (const char* str, char** endptr)
Funkcja zwraca przekonwertowaną wartość, zwraca również (przez referencję endptr) wskaźnik do pierwszego znaku ZA przekonwertowanym ciągiem cyfr.
Jakiekolwiek gmeranie w bajtach dalej odbieram jako RAŻĄCY BŁĄD - chyba, że ktoś mnie przekona, że jest w tym jakiś głębszy sens
> Można zawsze np. zmienić '\n' lub kropkę na bajt zerowy '\0' i
> dopiero takim "stuningowanym" łańcuchem nakarmić strdo*().
Można różne rzeczy, ale "ręczne" parsowanie ciągu bajtów w celu stworzenia złudzenia jakiejś użyteczności zrypanej funkcji standardowej budzi u mnie wewnętrzny sprzeciw.
> Pewnie poziom optymalizacji większy od zera?
Poziom optymalizacji, to takie trochę czary-mary-makagigi.
Kod wynikowy - to jest konkret. :-)
> Natomiast można oszczędzić w innych miejscach, np. I/O jest powolne -
> nie wyświetlaj na ekran ani nie zapisuj do pliku po jednym czy kilku
> bajtach. Buforuj i zapisuj cały bufor na raz. Tak samo z odczytem.
O czym ta mowa... ;-)
Korzystając z prostych środków napisałem program, który wykonuje swoją pracę w niecałe pół sekundy, podczas gdy jego wersja "kanoniczna" robiła to samo w ponad cztery - już z uwzględnieniem buforowania.
To jest zysk wyłącznie na optymalizacji I/O, i to nawet bez powąchania asemblera. ;-)
Sprzętowo takie przyśpieszenie mógłby zapewnić chyba upgrade do jakiegoś i7 z 2026 roku - a i to wątpliwe, bo ostatnio gęstnieją narzekania, że z coś nie ten-tego z Prawem Moore'a...
W ogóle taką "masówkę" powinno się załatwiać w wątku niezależnym od GUI, a już najlepiej temat zrównoleglić.
Tylko jak zrównoleglić sekwencyjny odczyt z pliku?
Można by stanąć gdzieś w środku bufora, złapać na szybko koniec linii i puścić drugi wątek parsujący.
Jeszcze tylko trzeba upchać jakoś dane z dwóch wątków, wiedząc, że wyszukiwać w nich będzie funkcja hashująca...
Choroba, samo pisanie na tej grupie jest inspirujące! :-)
> Jeśli kompilujesz C z optymalizacjami, to wygrać z kompilatorem w
> tych czasach może być ciężko.
Taki kod w C:
QueryPerformanceCounter(&StartCounter);
*cptr = 0x0;
while (iValue)
{
*--cptr = char(iValue % 10) | '0';
iValue /= 10;
}
QueryPerformanceCounter(&EndCounter);
wypluty przez MinGW do kodu asemblera wygląda tak:
call _QueryPerformanceCounter@4
subl $4, %esp
movl $2137483647, %ecx
leal 143(%esp), %ebx
leal 133(%esp), %edi
movb $0, 143(%esp)
.p2align 4,,10
L2:
movl %ecx, %eax
subl $1, %ebx
imull %esi
movl %ecx, %eax
sarl $31, %eax
sarl $2, %edx
subl %eax, %edx
leal (%edx,%edx,4), %eax
addl %eax, %eax
subl %eax, %ecx
orl $48, %ecx
cmpl %edi, %ebx
movb %cl, (%ebx)
movl %edx, %ecx
jne L2
leal 72(%esp), %eax
movl %eax, (%esp)
call _QueryPerformanceCounter@4
subl $4, %esp
Zakładam, że cała akcja dzieje się pomiędzy dwoma wywołaniami QueryPerformanceCounter.
Da się tu coś istotnego wywalić?
Na moje oko (skłute składnią AT&T :D) kompilator wyłapał i uwzględnił sąsiadujące modulo i dzielenie przez 10.
A wtedy - nic tu się nie urwie (ponad poziom szumu).
Czym się kurde różni SAR od SHR?
Technical Details
Message-ID:
<0f221c6c-4754-475f-a906-373a1fba35db@googlegroups.com>Path:
mbox-mo1.pugleaf.net!news-archive.icm.edu.pl!news.icm.edu.pl!newsfeed2.atman.pl!newsfeed.atman.pl!goblin1!goblin.stu.neva.ru!q69no18035itb.0!news-out.google.com!9ni28itl.0!nntp.google.com!k10no17898itk.0!postnews.google.com!glegroupsg2000goo.googlegroups.com!not-for-mailReferences:
<30292520-12bd-49f0-b5ce-39c9af378a4c@googlegroups.com> <5c5b41d7$0$501$65785112@news.neostrada.pl> <781a3ad8-10bb-42aa-939f-dc6c11efa783@googlegroups.com> <5c5df439$0$476$65785112@news.neostrada.pl>Show Full Headers
Complete Article Headers
X-Received: by 2002:a6b:f717:: with SMTP id k23mr4883426iog.28.1549900589361; Mon, 11 Feb 2019 07:56:29 -0800 (PST) X-Received: by 2002:a05:6830:130d:: with SMTP id p13mr254938otq.2.1549900589224; Mon, 11 Feb 2019 07:56:29 -0800 (PST) Path: mbox-mo1.pugleaf.net!news-archive.icm.edu.pl!news.icm.edu.pl!newsfeed2.atman.pl!newsfeed.atman.pl!goblin1!goblin.stu.neva.ru!q69no18035itb.0!news-out.google.com!9ni28itl.0!nntp.google.com!k10no17898itk.0!postnews.google.com!glegroupsg2000goo.googlegroups.com!not-for-mail Newsgroups: pl.comp.lang.asm Date: Mon, 11 Feb 2019 07:56:28 -0800 (PST) In-Reply-To: <5c5df439$0$476$65785112@news.neostrada.pl> Complaints-To: groups-abuse@google.com Injection-Info: glegroupsg2000goo.googlegroups.com; posting-host=80.238.104.22; posting-account=FE4hoAoAAADKg8EtnA4bEyQiJf7iqAgV NNTP-Posting-Host: 80.238.104.22 References: <30292520-12bd-49f0-b5ce-39c9af378a4c@googlegroups.com> <5c5b41d7$0$501$65785112@news.neostrada.pl> <781a3ad8-10bb-42aa-939f-dc6c11efa783@googlegroups.com> <5c5df439$0$476$65785112@news.neostrada.pl> User-Agent: G2/1.0 MIME-Version: 1.0 Message-ID: <0f221c6c-4754-475f-a906-373a1fba35db@googlegroups.com> Subject: Re: [1/3 NTG] C - Optymalizacje wstawkami From: mezzogm@gmail.com Injection-Date: Mon, 11 Feb 2019 15:56:29 +0000 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit