Jaký zvolit celočíselný datový typ? Skoro vždy integer
Tento článek byl napsán v roce 2016. Vývojářské technologie se neustále inovují a článek již nemusí popisovat aktuální stav technologie, ideální řešení a můj současný pohled na dané téma.
Řešíte při vývoji aplikací primitivní datové typy? Víte, kdy použít integer a kdy dát přednost typu byte? Pokud totiž nad podobnými otázkami neuvažujete, dost možná je Váš kód oproti přemýšlivým kolegům výkonnější. Jak je to vůbec možné se dočtete v tomto článku.
Seznámení s číselnými datovými typy
V C# (a dalších jazycích) existuje hned několik primitivních typů. Z hlediska možností jak uchovat číslo se většinou bavíme o desetinných a celočíselných datových typech. Kdybychom tyto typy rozdělili důsledně dle způsobu uchování hodnoty a práce s číslem, dalo by se mluvit o 3 základních kategoriích:
- celočíselné datové typy
- reálné datové typy
- datový typ decimal
Já v tomto článku budu psát pouze o první kategorii: celočíselných datových typech. Na webových stránkách, blogách i v chytrých knihách není problém dohledat různé tabulky poukazující na velikost konkrétních typů v bytech včetně jejich rozsahu. A tady začíná zábava. V řadě knih a odborných článků se totiž dočtete něco podobného:
Asi vás napadá otázka, proč máme tolik možných typů pro uložení čísla. Odpověď je prostá, záleží na jeho velikosti. Čím větší číslo, tím více spotřebuje paměti. Pro věk uživatele tedy zvolíme byte, protože se jistě nedožije více, než 255 let. Představte si databázi milionu uživatelů nějakého systému, když zvolíme místo byte int, bude zabírat 4x více místa. (zdroj)
Výše uvedená citace je víceméně pravdivá, ale může svést k mylné domněnce, že volba datového typu je závislá pouze na rozsahu hodnot, které chceme ukládat.
Je skutečně byte vhodný datový typ pro věk? Spíše ne.
Zpracování procesorem
Představme si teď například libovolnou proměnnou, kterou máme kdekoliv v programovém kódu:
byte age = 18;
Z hlediska čistě vývojářského obvykle moc neuvažujeme nad tím, co se děje při přiřazení hodnoty do proměnné nebo kde všude se taková proměnná používá. Řadu vývojářů asi nepřekvapí, že hodnota proměnné se uchovává na stacku a potřebuje pro tento účel (jak napovídá název) právě 1 byte.
"Problém" je, že instrukce programu jsou prováděné procesorem a i ten potřebuje s čísly určitým způsobem pracovat. Ke své práci používá instrukce, s jejichž pomocí provádí různé aritmetické a logické operace. Architektura dnešních procesorů je 32-bitová nebo 64-bitová a jak už asi tušíte, 32-bitový procesor operuje s 32-bitovými hodnotami. V závislosti na architektuře procesoru má tedy CPU s datovým typem byte nebo short další práci (musí binární číslo doplnit nulami na 32 bitů).
Pokud aplikace intenzivně nevyužívá operační paměť (například byte[]
vs. int[]
s 500 000 záznamy a více), pak volba "úspornějších" datových typů mnoho výhod nepřináší. Snaha o optimalizace v této oblasti až na velmi specifické případy spadá do kategorie mikrooptimalizací a ze zkušenosti si myslím, že většina vývojářských týmů má mnohem větší problémy s výkonem na řadě jiných míst.
Každopádně umělecké výtvory typu:
for (byte i = 0; i < 100; i++) { Console.WriteLine(i); }
přináší více škody než užitku.
Praktické hledisko a čistý kód
Ignorace datových typů byte a short do programového kódu přináší čistotu a snižuje riziko vzniku chyb v souvislosti s přetypováním proměnných. Člověk se ve svém životě setká skutečně s čímkoliv a ne každou chybu je schopen kompilátor objevit:
byte someByte = 15; int someInt = 2; byte result = (byte)(someByte + someInt); // ?? omg
Výhodou Int32 je také možnost použití implicitního typování lokálních proměnných, protože Int32 je ve své podstatě nativní celočíselný datový typ v .NET aplikacích (právě kvůli optimalizaci ze strany hardware).
var myAge = 29; // Int32
Upřednostněním Int32 také odpadá nejistota v souvislosti s otázkou "bude mi byte / short v budoucnu stačit?". Nakonec i v případě relačních DBS je nanejvýš praktické udržovat jeden datový typ umělých klíčů a ušetřit si problémy při vytváření cizích klíčů.
Život vývojáře je zkrátka s jedním celočíselným typem snazší
A jaké máte s celočíselnými typy zkušenosti vy? Podělte se v diskusi...