Search
a0b36apo_prednaska13-virt-overall.pdf
a0b36apo_prednaska13-virt-overall.odp
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