Proč je potřeba znát i nižší úrovně systému, než na které je vlastní (placený) projekt implementovaný.
Randall Hyde: The Write Great Code Series
Agner Fog: Software optimization resources
Free-Electrons: Embedded Linux, kernel ad real-time presentations (virtualizace a množství dalších kvalitních informací)
Při hledání PCI karty jsou načtena binárně data hlaviček PCI zařízení. První dvě dvojice byte identifikují výrobce a typ zařízení. Dva po sobě následující byte je tedy potřeba převést na 16-bit hodnotu a tu porovnat.
Zde jsou dvě řešení:
První, kdy kód píše někdo na základě chytré úvahy nad kombinováním možností funkcí, ale bez představy o tom, jak jsou data v paměti uložena a jaká je náročnost převodů mezi různými formáty (text/binarní číslo)
int concat16(int h, int l)
{
char s[20];
snprintf(s,sizeof(s)-1,"%02x%02x",h,l);
s[sizeof(s)-1] = 0;
return strtol(s,NULL,16);
}
Druhé řešení, které sice neumožňuje předvést své kombinatorické schopnosti, ale vychází ze znalosti vlastností aritmetiky ve dvojkové soustavě, je 100x až 1000x rychlejší.
int concat16(int h, int l)
{
return (h<<8)|l;
}
To druhé vypadá v kódu našeho modelovévo CPU (MIPS) takto
concat16:
sll v0,a0,0x8
jr ra
or v0,a1,v0
Na následujících obrázcích jsou znázorněné průběhy volání obou řešení analyzované programem valgrind a zobrazené programem kcachegrind při kompilaci pro paltformu x86_64 GNU/Linux a statickém linkování proti GLibC.
Program k otestování je v archivu right-vs-effective.tar.gz. K otestování je potřeba valgrid - neocenitelný nástroj pro hledání chyb v práci s pamětí a analýzu efektivního využití CACHE. Kompilace a zpuštění testu
make clean all val kcachegrind