🚀 go-pugleaf

RetroBBS NetNews Server

Inspired by RockSolid Light RIP Retro Guy

Article View: pl.comp.lang.asm
Article #2546

Re: [1/3 NTG] C - Optymalizacje wstawkami

#2546
From: mezzogm@gmail.co
Date: Mon, 11 Feb 2019 07:56
149 lines
4578 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?

Message-ID: <0f221c6c-4754-475f-a906-373a1fba35db@googlegroups.com>
Path: polish.pugleaf.net!archive.newsdeef.eu!apf1.newsdeef.eu!not-for-mail
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>