{"id":12949,"date":"2022-03-07T07:00:11","date_gmt":"2022-03-07T06:00:11","guid":{"rendered":"https:\/\/sii.pl\/blog\/?p=12949"},"modified":"2024-03-13T15:53:45","modified_gmt":"2024-03-13T14:53:45","slug":"branchless-programming-czyli-programowanie-bezgaleziowe","status":"publish","type":"post","link":"https:\/\/sii.pl\/blog\/branchless-programming-czyli-programowanie-bezgaleziowe\/","title":{"rendered":"Branchless programming czyli programowanie &#8222;bezga\u0142\u0119ziowe&#8221;"},"content":{"rendered":"\n<p>Rozga\u0142\u0119zienie w programowaniu to najpopularniejsza forma definiowania kierunku wykonywania programu. Wszystkie instrukcje warunkowe (if, switch, operator ?: ) i p\u0119tle (for, while, do while) s\u0105 podstaw\u0105 ka\u017cdego kodu \u017ar\u00f3d\u0142owego wykonywanego na maszynach zgodnych z modelem Turinga.<\/p>\n\n\n\n<p> Nie wyobra\u017camy sobie programowania bez instrukcji warunkowych, jednak w pewnych warunkach mo\u017cemy szuka\u0107 opcji zoptymalizowania czasu wykonywania naszego skomplikowanego programu.<\/p>\n\n\n\n<figure class=\"wp-block-image aligncenter\"><a href=\"https:\/\/sii.pl\/blog\/wp-content\/uploads\/2022\/03\/picture_1.png\"><img decoding=\"async\" width=\"753\" height=\"101\" src=\"https:\/\/sii.pl\/blog\/wp-content\/uploads\/2022\/03\/picture_1.png\" alt=\"Fragment kodu: BranchlessProgramming\" class=\"wp-image-12950\" srcset=\"https:\/\/sii.pl\/blog\/wp-content\/uploads\/2022\/03\/picture_1.png 753w, https:\/\/sii.pl\/blog\/wp-content\/uploads\/2022\/03\/picture_1-300x40.png 300w\" sizes=\"(max-width: 753px) 100vw, 753px\" \/><\/a><\/figure>\n\n\n\n<div style=\"height:20px\" aria-hidden=\"true\" class=\"wp-block-spacer\"><\/div>\n\n\n\n<h2 class=\"wp-block-heading\">Kiedy mo\u017ce pojawi\u0107 si\u0119 problem z instrukcjami warunkowymi?<\/h2>\n\n\n\n<p>Odpowied\u017a nasuwa si\u0119 sama i oczywi\u015bcie chodzi tutaj o krytyczne fragmenty programu, kt\u00f3rych wykonywanie mo\u017ce by\u0107 przez instrukcje warunkowe znacz\u0105co zwolnione. Jednak w celu zrozumienia, dlaczego problem mo\u017ce si\u0119 pojawi\u0107, nale\u017cy zrozumie\u0107 spos\u00f3b dzia\u0142ania procesora.<\/p>\n\n\n\n<figure class=\"wp-block-image aligncenter\"><a href=\"https:\/\/sii.pl\/blog\/wp-content\/uploads\/2022\/03\/picture_2.png\"><img decoding=\"async\" width=\"910\" height=\"49\" src=\"https:\/\/sii.pl\/blog\/wp-content\/uploads\/2022\/03\/picture_2.png\" alt=\"Schemat dzia\u0142ania procesora: IF, ID, EX, MEM, WB\" class=\"wp-image-12951\" srcset=\"https:\/\/sii.pl\/blog\/wp-content\/uploads\/2022\/03\/picture_2.png 910w, https:\/\/sii.pl\/blog\/wp-content\/uploads\/2022\/03\/picture_2-300x16.png 300w, https:\/\/sii.pl\/blog\/wp-content\/uploads\/2022\/03\/picture_2-768x41.png 768w\" sizes=\"(max-width: 910px) 100vw, 910px\" \/><\/a><\/figure>\n\n\n\n<div style=\"height:20px\" aria-hidden=\"true\" class=\"wp-block-spacer\"><\/div>\n\n\n\n<h3 class=\"wp-block-heading\">Technika potokowo\u015bci<\/h3>\n\n\n\n<p>CPU u\u017cywa bowiem <strong>techniki potokowo\u015bci (ang. Instruction Pipelining)<\/strong>, aby zoptymalizowa\u0107 wykonywanie rozkaz\u00f3w procesora. S\u0105 one dzielone na specjalizowane grupy, dzi\u0119ki czemu mog\u0105 jednocze\u015bnie wykona\u0107 cz\u0119\u015b\u0107 pracy zwi\u0105zanej z wykonywaniem rozkazu, niczym na ultraszybkiej ta\u015bmie produkcyjnej. Dzi\u0119ki temu, zanim jeszcze dojdzie do egzekucji instrukcji, s\u0105 one pobierane i dekodowane, a ca\u0142o\u015b\u0107 zaz\u0119bia si\u0119 i wykonuje r\u00f3wnolegle.<\/p>\n\n\n\n<figure class=\"wp-block-image aligncenter\"><a href=\"https:\/\/sii.pl\/blog\/wp-content\/uploads\/2022\/03\/picture_3.png\"><img decoding=\"async\" width=\"821\" height=\"153\" src=\"https:\/\/sii.pl\/blog\/wp-content\/uploads\/2022\/03\/picture_3.png\" alt=\"Graficznie przedstawiona technika potokowo\u015bci\" class=\"wp-image-12952\" srcset=\"https:\/\/sii.pl\/blog\/wp-content\/uploads\/2022\/03\/picture_3.png 821w, https:\/\/sii.pl\/blog\/wp-content\/uploads\/2022\/03\/picture_3-300x56.png 300w, https:\/\/sii.pl\/blog\/wp-content\/uploads\/2022\/03\/picture_3-768x143.png 768w\" sizes=\"(max-width: 821px) 100vw, 821px\" \/><\/a><\/figure>\n\n\n\n<p>W celu optymalizacji procesory pobieraj\u0105 instrukcje z wyprzedzeniem. Je\u015bli program posiada instrukcje warunkowe, CPU tak naprawd\u0119 zgaduje kilka instrukcji naprz\u00f3d. W przypadku napotkania w programie rozga\u0142\u0119zienia \u015bcie\u017cki wykonywania programu (czyli wyst\u0105pienia instrukcji skoku), procesor zak\u0142ada z g\u00f3ry okre\u015blon\u0105 drog\u0119, wi\u0119c dop\u00f3ki idziemy przewidzian\u0105 drog\u0105 wszystko jest w porz\u0105dku, ale <strong>problem pojawia si\u0119, kiedy logika programu zmieni kierunek<\/strong> i procesor musi si\u0119 zaadaptowa\u0107 do sytuacji \u2013 czyli w praktyce usun\u0105\u0107 cz\u0119\u015b\u0107 instrukcji i za\u0142adowa\u0107 nowy zestaw ponownie. Wsp\u00f3\u0142cze\u015bnie, szacuje si\u0119, \u017ce skoki zdarzaj\u0105 si\u0119 co kilkana\u015bcie instrukcji.<\/p>\n\n\n\n<figure class=\"wp-block-image aligncenter\"><a href=\"https:\/\/sii.pl\/blog\/wp-content\/uploads\/2022\/03\/picture_4.png\"><img decoding=\"async\" width=\"988\" height=\"251\" src=\"https:\/\/sii.pl\/blog\/wp-content\/uploads\/2022\/03\/picture_4.png\" alt=\"Grafika przedstawiaj\u0105ca skoki w technice potokowosci\" class=\"wp-image-12953\" srcset=\"https:\/\/sii.pl\/blog\/wp-content\/uploads\/2022\/03\/picture_4.png 988w, https:\/\/sii.pl\/blog\/wp-content\/uploads\/2022\/03\/picture_4-300x76.png 300w, https:\/\/sii.pl\/blog\/wp-content\/uploads\/2022\/03\/picture_4-768x195.png 768w\" sizes=\"(max-width: 988px) 100vw, 988px\" \/><\/a><\/figure>\n\n\n\n<div style=\"height:20px\" aria-hidden=\"true\" class=\"wp-block-spacer\"><\/div>\n\n\n\n<h2 class=\"wp-block-heading\">Czy mo\u017cna zoptymalizowa\u0107 wybieranie \u015bcie\u017cki wykonywania instrukcji?<\/h2>\n\n\n\n<p>Z pomoc\u0105 przychodzi <strong>idea programowania \u201ebezga\u0142\u0119ziowego\u201d (ang. Branchless Programming). <\/strong>Jej g\u0142\u00f3wnym za\u0142o\u017ceniem jest eliminowanie instrukcji skoku, szczeg\u00f3lnie w przypadkach, je\u015bli znacz\u0105co wp\u0142ywaj\u0105 one na wydajno\u015b\u0107 programu. Mo\u017ce to ostatecznie i tak nie znale\u017a\u0107 zastosowania przy nowoczesnych j\u0119zykach interpretowanych czy coraz bardziej inteligentnych kompilatorach z wieloma opcjami optymalizacji, ale przy zadaniach specjalnych wymagaj\u0105cych najwy\u017cszej wydajno\u015bci i jak najmniejszych op\u00f3\u017anie\u0144, taka technika mo\u017ce okaza\u0107 si\u0119 pomocna.<\/p>\n\n\n\n<p>Rozwa\u017caj\u0105c kod, najlepiej szuka\u0107 funkcji, kt\u00f3re wykonywane s\u0105 cz\u0119sto, w krytycznych fragmentach. Maj\u0105c funkcj\u0119 zwracaj\u0105c\u0105 mniejsz\u0105 z dw\u00f3ch warto\u015bci int:<\/p>\n\n\n\n<figure class=\"wp-block-image aligncenter\"><a href=\"https:\/\/sii.pl\/blog\/wp-content\/uploads\/2022\/03\/picture_5.png\"><img decoding=\"async\" width=\"644\" height=\"172\" src=\"https:\/\/sii.pl\/blog\/wp-content\/uploads\/2022\/03\/picture_5.png\" alt=\"Grafika funkcji zwracaj\u0105c\u0105ej mniejsz\u0105 z dw\u00f3ch warto\u015bci int\" class=\"wp-image-12954\" srcset=\"https:\/\/sii.pl\/blog\/wp-content\/uploads\/2022\/03\/picture_5.png 644w, https:\/\/sii.pl\/blog\/wp-content\/uploads\/2022\/03\/picture_5-300x80.png 300w\" sizes=\"(max-width: 644px) 100vw, 644px\" \/><\/a><\/figure>\n\n\n\n<p>zastan\u00f3w si\u0119, jak mo\u017cna pozby\u0107 si\u0119 instrukcji skoku w tego typu instrukcjach warunkowych.<\/p>\n\n\n\n<h3 class=\"wp-block-heading\">Instrukcja mno\u017cenia<\/h3>\n\n\n\n<p>Ot\u00f3\u017c mo\u017cna <strong>skorzysta\u0107 z instrukcji mno\u017cenia<\/strong>. W ko\u0144cu, je\u015bli wymno\u017cymy dan\u0105 warto\u015b\u0107 razy 1, nic si\u0119 nie zmieni, a zredukowa\u0107 warto\u015b\u0107 mo\u017cna mno\u017c\u0105c przez 0. Suma takich iloczyn\u00f3w zadzia\u0142a w tym przypadku identycznie jak powy\u017csza funkcja.<\/p>\n\n\n\n<figure class=\"wp-block-image aligncenter\"><a href=\"https:\/\/sii.pl\/blog\/wp-content\/uploads\/2022\/03\/picture_6.png\"><img decoding=\"async\" width=\"689\" height=\"121\" src=\"https:\/\/sii.pl\/blog\/wp-content\/uploads\/2022\/03\/picture_6.png\" alt=\"Grafika wykorzystania funkcji mno\u017cenia\" class=\"wp-image-12955\" srcset=\"https:\/\/sii.pl\/blog\/wp-content\/uploads\/2022\/03\/picture_6.png 689w, https:\/\/sii.pl\/blog\/wp-content\/uploads\/2022\/03\/picture_6-300x53.png 300w\" sizes=\"(max-width: 689px) 100vw, 689px\" \/><\/a><\/figure>\n\n\n\n<p>Znaj\u0105c tak\u0105 sztuczk\u0119, mo\u017cesz zamienia\u0107 dowolne warunki, a nawet <strong>skomplikowane switche<\/strong>. Korzystamy wi\u0119c ze schematu mno\u017cenia warto\u015bci przez warunek, kiedy dana warto\u015b\u0107 ma by\u0107 zwracana i dodawaniu kolejnych, analogicznych wyra\u017ce\u0144 dla nast\u0119pnych warunk\u00f3w.<\/p>\n\n\n\n<p>Czasami warto r\u00f3wnie\u017c cache\u2019owa\u0107 warto\u015b\u0107 warunk\u00f3w i<strong> korzysta\u0107 z negacji<\/strong>. Program w efekcie daje identyczne wyniki jak wersja z warunkami. Zauwa\u017calna jest natomiast zmiana w czytelno\u015bci kodu i, w przypadku stosowania programowania bez rozga\u0142\u0119zie\u0144, nale\u017cy zadba\u0107 o odpowiedni\u0105 nazw\u0119 funkcji i komentarz z uzasadnieniem wybranego podej\u015bcia.<\/p>\n\n\n\n<h2 class=\"wp-block-heading\">Jakie jeszcze operacje matematyczne mo\u017cna wykorzysta\u0107 zamiast rozga\u0142\u0119zie\u0144?<\/h2>\n\n\n\n<h3 class=\"wp-block-heading\">Maskowanie, zasada przepe\u0142nienia, operatory przesuwania<\/h3>\n\n\n\n<p>Maskowanie pomaga zast\u0105pi\u0107 sprawdzanie warunku i przypisywanie warto\u015bci. W analogiczny spos\u00f3b zast\u0119puje si\u0119 operator warunkowy. Wykorzystywa\u0107 mo\u017cna r\u00f3wnie\u017c zasady przepe\u0142niania i operatory przesuwania (ang. shift operator).<\/p>\n\n\n\n<p>Przyk\u0142adowo, funkcja zwracaj\u0105ca wi\u0119ksz\u0105 warto\u015b\u0107 z dw\u00f3ch argument\u00f3w w kodzie silnika graficznego CPUEngine wygl\u0105da nast\u0119puj\u0105co:<\/p>\n\n\n\n<figure class=\"wp-block-image aligncenter\"><a href=\"https:\/\/sii.pl\/blog\/wp-content\/uploads\/2022\/03\/picture_7.png\"><img decoding=\"async\" width=\"710\" height=\"127\" src=\"https:\/\/sii.pl\/blog\/wp-content\/uploads\/2022\/03\/picture_7.png\" alt=\"Grafika przedstawiaj\u0105ca funkcj\u0119 zwracaj\u0105c\u0105 wi\u0119ksz\u0105 warto\u015b\u0107 z dw\u00f3ch argument\u00f3w w kodzie silnika graficznego CPUEngine\" class=\"wp-image-12956\" srcset=\"https:\/\/sii.pl\/blog\/wp-content\/uploads\/2022\/03\/picture_7.png 710w, https:\/\/sii.pl\/blog\/wp-content\/uploads\/2022\/03\/picture_7-300x54.png 300w\" sizes=\"(max-width: 710px) 100vw, 710px\" \/><\/a><\/figure>\n\n\n\n<p>Wykorzystuj\u0105c <strong>operator modulo<\/strong>, mo\u017cna r\u00f3wnie\u017c w \u0142atwy i szybszy spos\u00f3b pobiera\u0107 warto\u015b\u0107 z tablicy:<\/p>\n\n\n\n<figure class=\"wp-block-image aligncenter\"><a href=\"https:\/\/sii.pl\/blog\/wp-content\/uploads\/2022\/03\/picture_8.png\"><img decoding=\"async\" width=\"838\" height=\"222\" src=\"https:\/\/sii.pl\/blog\/wp-content\/uploads\/2022\/03\/picture_8.png\" alt=\"Wykorzystanie operator modulo\" class=\"wp-image-12957\" srcset=\"https:\/\/sii.pl\/blog\/wp-content\/uploads\/2022\/03\/picture_8.png 838w, https:\/\/sii.pl\/blog\/wp-content\/uploads\/2022\/03\/picture_8-300x79.png 300w, https:\/\/sii.pl\/blog\/wp-content\/uploads\/2022\/03\/picture_8-768x203.png 768w\" sizes=\"(max-width: 838px) 100vw, 838px\" \/><\/a><\/figure>\n\n\n\n<p>Ponadto, warto doszukiwa\u0107 si\u0119 mo\u017cliwo\u015bci zastosowania operacji bitowych, na przyk\u0142ad przy szukaniu maski dla znaku w przypadku funkcji zwracaj\u0105cej warto\u015b\u0107 absolutn\u0105.<\/p>\n\n\n\n<h2 class=\"wp-block-heading\">Jak zweryfikowa\u0107 wyniki?<\/h2>\n\n\n\n<p>Weryfikacja ka\u017cdej zmiany jest bardzo zalecana. <strong>Przyk\u0142ad szukania mniejszej warto\u015bci<\/strong> pomaga \u0142atwo zrozumie\u0107 branchless programming, ale nie zawsze taka modyfikacja oznacza, \u017ce kod b\u0119dzie wykonywany szybciej.<\/p>\n\n\n\n<p>Korzystaj\u0105c przyk\u0142adowo z <a href=\"https:\/\/godbolt.org\/\" rel=\"nofollow\" >godbolt.org<\/a>, mo\u017cna podejrze\u0107 kod assemblera, kt\u00f3ry w przypadku pierwszej funkcji wygl\u0105da nast\u0119puj\u0105co:<\/p>\n\n\n\n<figure class=\"wp-block-image aligncenter\"><a href=\"https:\/\/sii.pl\/blog\/wp-content\/uploads\/2022\/03\/picture_9.png\"><img decoding=\"async\" width=\"1646\" height=\"399\" src=\"https:\/\/sii.pl\/blog\/wp-content\/uploads\/2022\/03\/picture_9.png\" alt=\"Kod assemblera w funkcji z rozga\u0142\u0119zieniami\" class=\"wp-image-12958\" srcset=\"https:\/\/sii.pl\/blog\/wp-content\/uploads\/2022\/03\/picture_9.png 1646w, https:\/\/sii.pl\/blog\/wp-content\/uploads\/2022\/03\/picture_9-300x73.png 300w, https:\/\/sii.pl\/blog\/wp-content\/uploads\/2022\/03\/picture_9-1024x248.png 1024w, https:\/\/sii.pl\/blog\/wp-content\/uploads\/2022\/03\/picture_9-768x186.png 768w, https:\/\/sii.pl\/blog\/wp-content\/uploads\/2022\/03\/picture_9-1536x372.png 1536w\" sizes=\"(max-width: 1646px) 100vw, 1646px\" \/><\/a><\/figure>\n\n\n\n<p>Natomiast w wersji bez rozga\u0142\u0119zie\u0144:<\/p>\n\n\n\n<figure class=\"wp-block-image aligncenter\"><a href=\"https:\/\/sii.pl\/blog\/wp-content\/uploads\/2022\/03\/picture_10.png\"><img decoding=\"async\" width=\"1622\" height=\"512\" src=\"https:\/\/sii.pl\/blog\/wp-content\/uploads\/2022\/03\/picture_10.png\" alt=\"Kod assemblera w wersji bez rozga\u0142\u0119zie\u0144\" class=\"wp-image-12959\" srcset=\"https:\/\/sii.pl\/blog\/wp-content\/uploads\/2022\/03\/picture_10.png 1622w, https:\/\/sii.pl\/blog\/wp-content\/uploads\/2022\/03\/picture_10-300x95.png 300w, https:\/\/sii.pl\/blog\/wp-content\/uploads\/2022\/03\/picture_10-1024x323.png 1024w, https:\/\/sii.pl\/blog\/wp-content\/uploads\/2022\/03\/picture_10-768x242.png 768w, https:\/\/sii.pl\/blog\/wp-content\/uploads\/2022\/03\/picture_10-1536x485.png 1536w\" sizes=\"(max-width: 1622px) 100vw, 1622px\" \/><\/a><\/figure>\n\n\n\n<p>Wynik nie jest spektakularny i wersja warunkowa w tym przypadku wcale nie zawiera mniejszej ilo\u015bci instrukcji (wynik jest zale\u017cny od wybranego kompilatora \u2013 na potrzeby tego artyku\u0142u korzystano z gcc 10.3 x86-64), ale <strong>nie zawiera<\/strong> on w tym przypadku <strong>instrukcji skoku jge, ani jmp. <\/strong><\/p>\n\n\n\n<p>Ponadto, <a href=\"https:\/\/quick-bench.com\/\" rel=\"nofollow\" >szybki test wydajno\u015bciowy na quick-bench.com<\/a> pokazuje, \u017ce wersja napisana jako bezga\u0142\u0119ziowa r\u0119cznie, jest czasowo optymalniejsza ni\u017c wersja oryginalna. W te\u015bcie por\u00f3wnywano wykonywanie poni\u017cszych funkcji dla warto\u015bci losowych (0,10) dla pierwszego i warto\u015bci 5 dla drugiego argumentu.<\/p>\n\n\n\n<figure class=\"wp-block-image aligncenter\"><a href=\"https:\/\/sii.pl\/blog\/wp-content\/uploads\/2022\/03\/picture_11.png\"><img decoding=\"async\" width=\"1226\" height=\"864\" src=\"https:\/\/sii.pl\/blog\/wp-content\/uploads\/2022\/03\/picture_11.png\" alt=\"Grafika przedstawiaj\u0105ca wyniki testu wydajno\u015bciowego\" class=\"wp-image-12960\" srcset=\"https:\/\/sii.pl\/blog\/wp-content\/uploads\/2022\/03\/picture_11.png 1226w, https:\/\/sii.pl\/blog\/wp-content\/uploads\/2022\/03\/picture_11-300x211.png 300w, https:\/\/sii.pl\/blog\/wp-content\/uploads\/2022\/03\/picture_11-1024x722.png 1024w, https:\/\/sii.pl\/blog\/wp-content\/uploads\/2022\/03\/picture_11-768x541.png 768w\" sizes=\"(max-width: 1226px) 100vw, 1226px\" \/><\/a><\/figure>\n\n\n\n<div style=\"height:20px\" aria-hidden=\"true\" class=\"wp-block-spacer\"><\/div>\n\n\n\n<h2 class=\"wp-block-heading\">Jak du\u017ce mo\u017ce to mie\u0107 znaczenie?<\/h2>\n\n\n\n<p>Trzeba mie\u0107 zawsze na uwadze, \u017ce wsp\u00f3\u0142czesne kompilatory radz\u0105 sobie coraz lepiej z optymalizacj\u0105 i cz\u0119sto te\u017c same doszukuj\u0105 si\u0119 (o ile to mo\u017cliwe i pomocne) mo\u017cliwo\u015bci zmiany kodu na kod bez rozga\u0142\u0119zie\u0144. W powy\u017cszym przyk\u0142adzie benchmark nie korzysta\u0142 z optymalizacji kompilatora.<\/p>\n\n\n\n<p>W przypadku <strong>optymalizacji O3, r\u00f3\u017cnica wydajno\u015bci obu wersji jest ju\u017c niezauwa\u017calna<\/strong>. Kompilator zna metody usuwania ga\u0142\u0119zi i automatycznie usprawni\u0142 nasz kod pod k\u0105tem wydajno\u015bci. Ponadto, procesory wyposa\u017cane s\u0105 w algorytmy optymalizacji, op\u00f3\u017anionych instrukcji skoku czy skomplikowanych modeli predykcji skok\u00f3w.<\/p>\n\n\n\n<p>Czasami jednak, nadal narz\u0119dzia mog\u0105 za\u0142o\u017cy\u0107 co\u015b innego ni\u017c programista. <strong>W krytycznych fragmentach kodu mog\u0105 liczy\u0107 si\u0119 milisekundy<\/strong>. Przyk\u0142adowo, pracuj\u0105c kiedy\u015b nad<strong> projektem embeddedowym<\/strong> w zakresie cyfrowego przetwarzania na procesorze, poszukiwa\u0142em rozwi\u0105zania dla implementacji szybkich funkcji trygonometrycznych bez mo\u017cliwo\u015bci u\u017cycia biblioteki.<\/p>\n\n\n\n<p>W tym przypadku implementacje bez rozga\u0142\u0119zie\u0144 pomog\u0142y zredukowa\u0107 czasy oblicze\u0144 do poziomu czas\u00f3w wykonywania analogicznych oblicze\u0144 z u\u017cyciem biblioteki. Nie by\u0142o to oczywi\u015bcie wdra\u017cane bez uprzednich, skrupulatnych pomiar\u00f3w. Warto wi\u0119c sprawdzi\u0107, czy optymalizacja z u\u017cyciem programowania bez rozga\u0142\u0119zie\u0144 faktycznie sprawia, \u017ce kod wykonuje si\u0119 szybciej. A nie zawsze tak jest!<\/p>\n\n\n\n<h2 class=\"wp-block-heading\">Kiedy korzysta\u0107 z programowania bez rozga\u0142\u0119zie\u0144?<\/h2>\n\n\n\n<p>Maj\u0105c takie narz\u0119dzia w zanadrzu, \u0142atwo ulec pokusie zast\u0119powania wszystkich instrukcji wersjami bez rozga\u0142\u0119zie\u0144. Nie jest to jednak dobra praktyka! <strong>Do\u015bwiadczony programista zawsze weryfikuje<\/strong>, zanim podejdzie do optymalizacji. <strong>Uzasadnieniem usuwania naturalnych rozga\u0142\u0119zie\u0144 powinna by\u0107 zawsze wymierna i sprawdzona korzy\u015b\u0107.<\/strong> Je\u015bli program faktycznie zyskuje na podej\u015bciu bez skok\u00f3w i jest to krytyczny fragment, mo\u017cna pozwoli\u0107 sobie na mniejsz\u0105 czytelno\u015b\u0107 kodu, zyskuj\u0105c na czasie wykonania.<\/p>\n\n\n\n<figure class=\"wp-block-embed aligncenter is-type-video is-provider-youtube wp-block-embed-youtube wp-embed-aspect-16-9 wp-has-aspect-ratio\"><div class=\"wp-block-embed__wrapper\">\n<iframe title=\"Software Developer, Product Owner i Team Leader w jednej osobie!\" width=\"500\" height=\"281\" src=\"https:\/\/www.youtube.com\/embed\/A9M3f_bvEDQ?list=PLQXpRIbR-9fu_Dpv8IB1fCwhlQUKn4RR-\" frameborder=\"0\" allow=\"accelerometer; autoplay; clipboard-write; encrypted-media; gyroscope; picture-in-picture; web-share\" referrerpolicy=\"strict-origin-when-cross-origin\" allowfullscreen><\/iframe>\n<\/div><\/figure>\n\n\n<div class=\"kk-star-ratings kksr-auto kksr-align-left kksr-valign-bottom\"\n    data-payload='{&quot;align&quot;:&quot;left&quot;,&quot;id&quot;:&quot;12949&quot;,&quot;slug&quot;:&quot;default&quot;,&quot;valign&quot;:&quot;bottom&quot;,&quot;ignore&quot;:&quot;&quot;,&quot;reference&quot;:&quot;auto&quot;,&quot;class&quot;:&quot;&quot;,&quot;count&quot;:&quot;16&quot;,&quot;legendonly&quot;:&quot;&quot;,&quot;readonly&quot;:&quot;&quot;,&quot;score&quot;:&quot;5&quot;,&quot;starsonly&quot;:&quot;&quot;,&quot;best&quot;:&quot;5&quot;,&quot;gap&quot;:&quot;11&quot;,&quot;greet&quot;:&quot;&quot;,&quot;legend&quot;:&quot;5\\\/5 ( votes: 16)&quot;,&quot;size&quot;:&quot;18&quot;,&quot;title&quot;:&quot;Branchless programming czyli programowanie \\u0026quot;bezga\u0142\u0119ziowe\\u0026quot;&quot;,&quot;width&quot;:&quot;139.5&quot;,&quot;_legend&quot;:&quot;{score}\\\/{best} ( {votes}: {count})&quot;,&quot;font_factor&quot;:&quot;1.25&quot;}'>\n            \n<div class=\"kksr-stars\">\n    \n<div class=\"kksr-stars-inactive\">\n            <div class=\"kksr-star\" data-star=\"1\" style=\"padding-right: 11px\">\n            \n\n<div class=\"kksr-icon\" style=\"width: 18px; height: 18px;\"><\/div>\n        <\/div>\n            <div class=\"kksr-star\" data-star=\"2\" style=\"padding-right: 11px\">\n            \n\n<div class=\"kksr-icon\" style=\"width: 18px; height: 18px;\"><\/div>\n        <\/div>\n            <div class=\"kksr-star\" data-star=\"3\" style=\"padding-right: 11px\">\n            \n\n<div class=\"kksr-icon\" style=\"width: 18px; height: 18px;\"><\/div>\n        <\/div>\n            <div class=\"kksr-star\" data-star=\"4\" style=\"padding-right: 11px\">\n            \n\n<div class=\"kksr-icon\" style=\"width: 18px; height: 18px;\"><\/div>\n        <\/div>\n            <div class=\"kksr-star\" data-star=\"5\" style=\"padding-right: 11px\">\n            \n\n<div class=\"kksr-icon\" style=\"width: 18px; height: 18px;\"><\/div>\n        <\/div>\n    <\/div>\n    \n<div class=\"kksr-stars-active\" style=\"width: 139.5px;\">\n            <div class=\"kksr-star\" style=\"padding-right: 11px\">\n            \n\n<div class=\"kksr-icon\" style=\"width: 18px; height: 18px;\"><\/div>\n        <\/div>\n            <div class=\"kksr-star\" style=\"padding-right: 11px\">\n            \n\n<div class=\"kksr-icon\" style=\"width: 18px; height: 18px;\"><\/div>\n        <\/div>\n            <div class=\"kksr-star\" style=\"padding-right: 11px\">\n            \n\n<div class=\"kksr-icon\" style=\"width: 18px; height: 18px;\"><\/div>\n        <\/div>\n            <div class=\"kksr-star\" style=\"padding-right: 11px\">\n            \n\n<div class=\"kksr-icon\" style=\"width: 18px; height: 18px;\"><\/div>\n        <\/div>\n            <div class=\"kksr-star\" style=\"padding-right: 11px\">\n            \n\n<div class=\"kksr-icon\" style=\"width: 18px; height: 18px;\"><\/div>\n        <\/div>\n    <\/div>\n<\/div>\n                \n\n<div class=\"kksr-legend\" style=\"font-size: 14.4px;\">\n            5\/5 ( votes: 16)    <\/div>\n    <\/div>\n","protected":false},"excerpt":{"rendered":"<p>Rozga\u0142\u0119zienie w programowaniu to najpopularniejsza forma definiowania kierunku wykonywania programu. Wszystkie instrukcje warunkowe (if, switch, operator ?: ) i p\u0119tle &hellip; <a class=\"continued-btn\" href=\"https:\/\/sii.pl\/blog\/branchless-programming-czyli-programowanie-bezgaleziowe\/\">Continued<\/a><\/p>\n","protected":false},"author":337,"featured_media":12973,"comment_status":"open","ping_status":"open","sticky":false,"template":"","format":"standard","meta":{"_acf_changed":false,"_editorskit_title_hidden":false,"_editorskit_reading_time":3,"_editorskit_is_block_options_detached":false,"_editorskit_block_options_position":"{}","inline_featured_image":false,"footnotes":""},"categories":[1314],"tags":[563,1203,1528,1204],"class_list":["post-12949","post","type-post","status-publish","format-standard","has-post-thumbnail","hentry","category-development-na-twardo","tag-embedded","tag-instrukcje-warunkowe","tag-jezyk-programowania","tag-programowanie-bezgaleziowe"],"acf":[],"aioseo_notices":[],"republish_history":[],"featured_media_url":"https:\/\/sii.pl\/blog\/wp-content\/uploads\/2022\/03\/Branchless-programming-2.png","category_names":["Development na twardo"],"_links":{"self":[{"href":"https:\/\/sii.pl\/blog\/wp-json\/wp\/v2\/posts\/12949"}],"collection":[{"href":"https:\/\/sii.pl\/blog\/wp-json\/wp\/v2\/posts"}],"about":[{"href":"https:\/\/sii.pl\/blog\/wp-json\/wp\/v2\/types\/post"}],"author":[{"embeddable":true,"href":"https:\/\/sii.pl\/blog\/wp-json\/wp\/v2\/users\/337"}],"replies":[{"embeddable":true,"href":"https:\/\/sii.pl\/blog\/wp-json\/wp\/v2\/comments?post=12949"}],"version-history":[{"count":3,"href":"https:\/\/sii.pl\/blog\/wp-json\/wp\/v2\/posts\/12949\/revisions"}],"predecessor-version":[{"id":27182,"href":"https:\/\/sii.pl\/blog\/wp-json\/wp\/v2\/posts\/12949\/revisions\/27182"}],"wp:featuredmedia":[{"embeddable":true,"href":"https:\/\/sii.pl\/blog\/wp-json\/wp\/v2\/media\/12973"}],"wp:attachment":[{"href":"https:\/\/sii.pl\/blog\/wp-json\/wp\/v2\/media?parent=12949"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"https:\/\/sii.pl\/blog\/wp-json\/wp\/v2\/categories?post=12949"},{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/sii.pl\/blog\/wp-json\/wp\/v2\/tags?post=12949"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}