{"id":2598,"date":"2023-01-27T21:12:03","date_gmt":"2023-01-27T21:12:03","guid":{"rendered":"https:\/\/sunucucozumleri.com\/?p=2598"},"modified":"2023-01-27T21:12:03","modified_gmt":"2023-01-27T21:12:03","slug":"neden-sirali-bir-diziyi-islemek-siralanmamis-bir-diziyi-islemekten-daha-hizlidir","status":"publish","type":"post","link":"https:\/\/sunucucozumleri.com\/blog\/neden-sirali-bir-diziyi-islemek-siralanmamis-bir-diziyi-islemekten-daha-hizlidir\/","title":{"rendered":"Neden s\u0131ral\u0131 bir diziyi i\u015flemek, s\u0131ralanmam\u0131\u015f bir diziyi i\u015flemekten daha h\u0131zl\u0131d\u0131r?"},"content":{"rendered":"<div id=\"ez-toc-container\" class=\"ez-toc-v2_0_82_2 counter-hierarchy ez-toc-counter ez-toc-grey ez-toc-container-direction\">\n<div class=\"ez-toc-title-container\">\n<p class=\"ez-toc-title\" style=\"cursor:inherit\">Makale \u0130\u00e7eri\u011fi<\/p>\n<span class=\"ez-toc-title-toggle\"><a href=\"#\" class=\"ez-toc-pull-right ez-toc-btn ez-toc-btn-xs ez-toc-btn-default ez-toc-toggle\" aria-label=\"\u0130\u00e7indekiler Tablosunu A\u00e7\/Kapat\"><span class=\"ez-toc-js-icon-con\"><span class=\"\"><span class=\"eztoc-hide\" style=\"display:none;\">Toggle<\/span><span class=\"ez-toc-icon-toggle-span\"><svg style=\"fill: #999;color:#999\" xmlns=\"http:\/\/www.w3.org\/2000\/svg\" class=\"list-377408\" width=\"20px\" height=\"20px\" viewBox=\"0 0 24 24\" fill=\"none\"><path d=\"M6 6H4v2h2V6zm14 0H8v2h12V6zM4 11h2v2H4v-2zm16 0H8v2h12v-2zM4 16h2v2H4v-2zm16 0H8v2h12v-2z\" fill=\"currentColor\"><\/path><\/svg><svg style=\"fill: #999;color:#999\" class=\"arrow-unsorted-368013\" xmlns=\"http:\/\/www.w3.org\/2000\/svg\" width=\"10px\" height=\"10px\" viewBox=\"0 0 24 24\" version=\"1.2\" baseProfile=\"tiny\"><path d=\"M18.2 9.3l-6.2-6.3-6.2 6.3c-.2.2-.3.4-.3.7s.1.5.3.7c.2.2.4.3.7.3h11c.3 0 .5-.1.7-.3.2-.2.3-.5.3-.7s-.1-.5-.3-.7zM5.8 14.7l6.2 6.3 6.2-6.3c.2-.2.3-.5.3-.7s-.1-.5-.3-.7c-.2-.2-.4-.3-.7-.3h-11c-.3 0-.5.1-.7.3-.2.2-.3.5-.3.7s.1.5.3.7z\"\/><\/svg><\/span><\/span><\/span><\/a><\/span><\/div>\n<nav><ul class='ez-toc-list ez-toc-list-level-1 ' ><li class='ez-toc-page-1 ez-toc-heading-level-2'><a class=\"ez-toc-link ez-toc-heading-1\" href=\"https:\/\/sunucucozumleri.com\/blog\/neden-sirali-bir-diziyi-islemek-siralanmamis-bir-diziyi-islemekten-daha-hizlidir\/#Yazilim_Neden_Yavas_Calisir_Basit_bir_ornek_ile_anlatalim\" >Yaz\u0131l\u0131m Neden Yava\u015f \u00c7al\u0131\u015f\u0131r? Basit bir \u00f6rnek ile anlatal\u0131m<\/a><\/li><li class='ez-toc-page-1 ez-toc-heading-level-2'><a class=\"ez-toc-link ez-toc-heading-2\" href=\"https:\/\/sunucucozumleri.com\/blog\/neden-sirali-bir-diziyi-islemek-siralanmamis-bir-diziyi-islemekten-daha-hizlidir\/#Yukaridan_ima_edildigi_gibi_suclu_bu_if-ifadesidir\" >Yukar\u0131dan ima edildi\u011fi gibi, su\u00e7lu bu if-ifadesidir:<\/a><\/li><\/ul><\/nav><\/div>\n<h2 class=\"entry-sub-title\"><span class=\"ez-toc-section\" id=\"Yazilim_Neden_Yavas_Calisir_Basit_bir_ornek_ile_anlatalim\"><\/span>Yaz\u0131l\u0131m Neden Yava\u015f \u00c7al\u0131\u015f\u0131r? Basit bir \u00f6rnek ile anlatal\u0131m<span class=\"ez-toc-section-end\"><\/span><\/h2>\n<p>\u0130\u015fte \u00e7ok tuhaf davran\u0131\u015flar g\u00f6steren bir C ++ kodu par\u00e7as\u0131. Garip bir nedenden dolay\u0131, verileri mucizevi bir \u015fekilde s\u0131ralamak, kodu neredeyse alt\u0131 kat daha h\u0131zl\u0131 hale getirir:<\/p>\n<pre>#include \r\n#include \r\n#include \r\n\r\nint main()\r\n{\r\n    \/\/ Generate data\r\n    const unsigned arraySize = 32768;\r\n    int data[arraySize];\r\n\r\n    for (unsigned c = 0; c &lt; arraySize; ++c)\r\n        data[c] = std::rand() % 256;\r\n\r\n    \/\/ !!! With this, the next loop runs faster.\r\n    std::sort(data, data + arraySize);\r\n\r\n    \/\/ Test\r\n    clock_t start = clock();\r\n    long long sum = 0;\r\n\r\n    for (unsigned i = 0; i &lt; 100000; ++i)\r\n    {\r\n        \/\/ Primary loop\r\n        for (unsigned c = 0; c &lt; arraySize; ++c) { if (data[c] &gt;= 128)\r\n                sum += data[c];\r\n        }\r\n    }\r\n\r\n    double elapsedTime = static_cast(clock() - start) \/ CLOCKS_PER_SEC;\r\n\r\n    std::cout &lt;&lt; elapsedTime &lt;&lt; std::endl;\r\n    std::cout &lt;&lt; \"sum = \" &lt;&lt; sum &lt;&lt; std::endl;\r\n}\r\n<\/pre>\n<ul>\n<li><code>std::sort(data, data + arraySize);<\/code>, kod 11,54 saniyede \u00e7al\u0131\u015f\u0131r.<\/li>\n<li>S\u0131ralanan verilerle kod 1,93 saniyede \u00e7al\u0131\u015f\u0131r.<\/li>\n<\/ul>\n<p>Ba\u015flang\u0131\u00e7ta, bunun sadece bir dil veya derleyici anormalli\u011fi olabilece\u011fini d\u00fc\u015f\u00fcnd\u00fcm, bu y\u00fczden Java\u2019y\u0131 denedim:<\/p>\n<pre>import java.util.Arrays;\r\nimport java.util.Random;\r\n\r\npublic class Main\r\n{\r\n    public static void main(String[] args)\r\n    {\r\n        \/\/ Generate data\r\n        int arraySize = 32768;\r\n        int data[] = new int[arraySize];\r\n\r\n        Random rnd = new Random(0);\r\n        for (int c = 0; c &lt; arraySize; ++c)\r\n            data[c] = rnd.nextInt() % 256;\r\n\r\n        \/\/ !!! With this, the next loop runs faster\r\n        Arrays.sort(data);\r\n\r\n        \/\/ Test\r\n        long start = System.nanoTime();\r\n        long sum = 0;\r\n\r\n        for (int i = 0; i &lt; 100000; ++i)\r\n        {\r\n            \/\/ Primary loop\r\n            for (int c = 0; c &lt; arraySize; ++c) { if (data[c] &gt;= 128)\r\n                    sum += data[c];\r\n            }\r\n        }\r\n\r\n        System.out.println((System.nanoTime() - start) \/ 1000000000.0);\r\n        System.out.println(\"sum = \" + sum);\r\n    }\r\n}\r\n<\/pre>\n<p>Benzer sonu\u00e7lar\u0131 JAVA ile de alm\u0131\u015f bulundum.<\/p>\n<hr \/>\n<p>\u0130lk d\u00fc\u015f\u00fcncem, s\u0131ralaman\u0131n verileri\u00a0\u00f6nbelle\u011fe\u00a0getirmesiydi\u00a0, ama sonra bunun ne kadar yanl\u0131\u015f oldu\u011funu d\u00fc\u015f\u00fcnd\u00fcm \u00e7\u00fcnk\u00fc dizi yeni olu\u015fturulmu\u015ftu.<\/p>\n<ul>\n<li>Ne oluyor?<\/li>\n<li>Neden s\u0131ral\u0131 bir diziyi i\u015flemek, s\u0131ralanmam\u0131\u015f bir diziyi i\u015flemekten daha h\u0131zl\u0131d\u0131r?<\/li>\n<\/ul>\n<p>Kod baz\u0131 ba\u011f\u0131ms\u0131z terimleri \u00f6zetliyor, bu nedenle s\u0131ra \u00f6nemli olmamal\u0131.<\/p>\n<p>Sonu\u00e7;<\/p>\n<p>Bir demiryolu kav\u015fa\u011f\u0131n\u0131 d\u00fc\u015f\u00fcn\u00fcn:<\/p>\n<figure id=\"attachment_403\" class=\"wp-caption alignnone\" aria-describedby=\"caption-attachment-403\"><img decoding=\"async\" class=\"wp-image-403 lazyautosizes lazyloaded\" src=\"https:\/\/blog.sunucucozumleri.com\/wp-content\/uploads\/2020\/10\/muxnt-300x225.jpg\" sizes=\"708px\" srcset=\"https:\/\/blog.sunucucozumleri.com\/wp-content\/uploads\/2020\/10\/muxnt-300x225.jpg 300w, https:\/\/blog.sunucucozumleri.com\/wp-content\/uploads\/2020\/10\/muxnt.jpg 640w\" alt=\"demiryolu\" width=\"821\" height=\"616\" data-src=\"https:\/\/blog.sunucucozumleri.com\/wp-content\/uploads\/2020\/10\/muxnt-300x225.jpg\" data-srcset=\"https:\/\/blog.sunucucozumleri.com\/wp-content\/uploads\/2020\/10\/muxnt-300x225.jpg 300w, https:\/\/blog.sunucucozumleri.com\/wp-content\/uploads\/2020\/10\/muxnt.jpg 640w\" data-sizes=\"auto\" data- title=\"\"><figcaption id=\"caption-attachment-403\" class=\"wp-caption-text\">demiryolu<\/figcaption><\/figure>\n<p>\u015eimdi tart\u0131\u015fman\u0131n, 1800\u2019l\u00fc y\u0131llara geri d\u00f6nd\u00fc\u011f\u00fcn\u00fc varsayal\u0131m \u2013 uzun mesafe veya radyo ileti\u015fiminden \u00f6nce.<\/p>\n<p>Bir kav\u015fa\u011f\u0131n operat\u00f6r\u00fcs\u00fcn\u00fcz ve bir trenin geldi\u011fini duyars\u0131n\u0131z.\u00a0Hangi y\u00f6ne gitmesi gerekti\u011fine dair hi\u00e7bir fikrin yok.\u00a0S\u00fcr\u00fcc\u00fcye hangi y\u00f6ne gitmek istediklerini sormak i\u00e7in treni durduruyorsunuz.\u00a0Ve sonra anahtar\u0131 uygun \u015fekilde ayarlars\u0131n\u0131z.<\/p>\n<p><em>Trenler a\u011f\u0131rd\u0131r ve \u00e7ok fazla ataleti vard\u0131r.\u00a0Bu y\u00fczden ba\u015flamas\u0131 ve yava\u015flamas\u0131 sonsuza kadar s\u00fcrer.<\/em><\/p>\n<p>Daha iyi bir yol var m\u0131?\u00a0Trenin hangi y\u00f6ne gidece\u011fini tahmin edin!<\/p>\n<ul>\n<li>Do\u011fru tahmin ettiyseniz, devam ediyor.<\/li>\n<li>Yanl\u0131\u015f tahmin ettiyseniz, kaptan duracak, geri d\u00f6necek ve d\u00fc\u011fmeyi \u00e7evirmeniz i\u00e7in size ba\u011f\u0131racak.\u00a0Ard\u0131ndan di\u011fer yolu yeniden ba\u015flatabilir.<\/li>\n<\/ul>\n<p><strong>Her seferinde do\u011fru tahmin ederseniz<\/strong>\u00a0, tren asla durmak zorunda kalmayacak.<br \/>\n<strong>\u00c7ok s\u0131k yanl\u0131\u015f tahmin ederseniz<\/strong>\u00a0, tren durmak, yedeklemek ve yeniden ba\u015flatmak i\u00e7in \u00e7ok zaman harcayacakt\u0131r.<\/p>\n<hr \/>\n<p><strong>Bir if ifadesini d\u00fc\u015f\u00fcn\u00fcn:<\/strong>\u00a0\u0130\u015flemci d\u00fczeyinde, bu bir dal talimatt\u0131r:<\/p>\n<p><img decoding=\"async\" class=\"alignnone size-medium wp-image-404 lazyautosizes lazyloaded\" src=\"https:\/\/blog.sunucucozumleri.com\/wp-content\/uploads\/2020\/10\/pyfwC-300x48.png\" sizes=\"300px\" srcset=\"https:\/\/blog.sunucucozumleri.com\/wp-content\/uploads\/2020\/10\/pyfwC-300x48.png 300w, https:\/\/blog.sunucucozumleri.com\/wp-content\/uploads\/2020\/10\/pyfwC.png 567w\" alt=\"\" width=\"300\" height=\"48\" data-src=\"https:\/\/blog.sunucucozumleri.com\/wp-content\/uploads\/2020\/10\/pyfwC-300x48.png\" data-srcset=\"https:\/\/blog.sunucucozumleri.com\/wp-content\/uploads\/2020\/10\/pyfwC-300x48.png 300w, https:\/\/blog.sunucucozumleri.com\/wp-content\/uploads\/2020\/10\/pyfwC.png 567w\" data-sizes=\"auto\" data- title=\"\"><\/p>\n<p>Sen bir i\u015flemcisin ve bir dal g\u00f6r\u00fcyorsun.\u00a0Hangi y\u00f6ne gidece\u011fine dair hi\u00e7bir fikrin yok.\u00a0Ne yapars\u0131n?\u00a0Y\u00fcr\u00fctmeyi durdurur ve \u00f6nceki talimatlar tamamlanana kadar beklersiniz.\u00a0Sonra do\u011fru yola devam edersiniz.<\/p>\n<p><em>Modern i\u015flemciler karma\u015f\u0131kt\u0131r ve uzun boru hatlar\u0131na sahiptir.\u00a0Bu y\u00fczden \u201c\u0131s\u0131nmalar\u0131\u201d ve \u201cyava\u015flamalar\u0131\u201d sonsuza kadar s\u00fcrer.<\/em><\/p>\n<p>Daha iyi bir yol var m\u0131?\u00a0Dal\u0131n hangi y\u00f6ne gidece\u011fini tahmin edin!<\/p>\n<ul>\n<li>Do\u011fru tahmin ettiyseniz, uygulamaya devam edersiniz.<\/li>\n<li>Yanl\u0131\u015f tahmin ettiyseniz, boru hatt\u0131n\u0131 y\u0131kaman\u0131z ve \u015fubeye geri d\u00f6nmeniz gerekir.\u00a0Ard\u0131ndan di\u011fer yolu yeniden ba\u015flatabilirsiniz.<\/li>\n<\/ul>\n<p><strong>Her seferinde do\u011fru tahmin ederseniz<\/strong>\u00a0, infaz\u0131n asla durmas\u0131 gerekmeyecek.<br \/>\n<strong>\u00c7ok s\u0131k yanl\u0131\u015f tahmin ederseniz<\/strong>\u00a0,\u00a0<strong>\u00e7ok fazla zaman<\/strong>\u00a0harcars\u0131n\u0131z, oyalan\u0131p geri \u00e7ekilirsiniz ve yeniden ba\u015flars\u0131n\u0131z.<\/p>\n<hr \/>\n<p>Bu \u015fube tahminidir.\u00a0Tren sadece bir bayrakla y\u00f6n\u00fc i\u015faret edebildi\u011fi i\u00e7in bunun en iyi benzetme olmad\u0131\u011f\u0131n\u0131 kabul ediyorum.\u00a0Ancak bilgisayarlarda i\u015flemci son ana kadar bir \u015fubenin hangi y\u00f6ne gidece\u011fini bilemez.<\/p>\n<p>\u00d6yleyse, trenin yedeklenmesi ve di\u011fer yola inmesi gereken zaman\u0131 en aza indirmek i\u00e7in stratejik olarak nas\u0131l tahmin edersiniz?\u00a0Ge\u00e7mi\u015fe bak\u0131yorsun!\u00a0Tren zaman\u0131n% 99\u2019unu terk ederse, san\u0131r\u0131m sola.\u00a0De\u011fi\u015firse, tahminlerinizi de\u011fi\u015ftirirsiniz.\u00a0Her \u00fc\u00e7 seferde bir y\u00f6ne giderse, ayn\u0131 tahmin edersiniz \u2026<\/p>\n<p><em><strong>Ba\u015fka bir deyi\u015fle, bir model belirlemeye ve onu takip etmeye \u00e7al\u0131\u015f\u0131rs\u0131n\u0131z.\u00a0<\/strong><\/em>Bu, a\u015fa\u011f\u0131 yukar\u0131 \u015fube tahmincilerinin nas\u0131l \u00e7al\u0131\u015ft\u0131\u011f\u0131d\u0131r.<\/p>\n<p>\u00c7o\u011fu uygulaman\u0131n iyi huylu dallar\u0131 vard\u0131r.\u00a0Dolay\u0131s\u0131yla, modern \u015fube tahmincileri tipik olarak&gt;% 90 isabet oranlar\u0131na ula\u015facakt\u0131r.\u00a0Ancak, tan\u0131nabilir \u00f6r\u00fcnt\u00fcleri olmayan, \u00f6ng\u00f6r\u00fclemeyen dallarla kar\u015f\u0131la\u015f\u0131ld\u0131\u011f\u0131nda, dal belirleyicileri neredeyse i\u015fe yaramaz.<\/p>\n<p>Daha fazla bilgi i\u00e7in:\u00a0Wikipedia\u2019daki \u201cDal belirleyici\u201d makalesi\u00a0.<\/p>\n<hr \/>\n<h2><span class=\"ez-toc-section\" id=\"Yukaridan_ima_edildigi_gibi_suclu_bu_if-ifadesidir\"><\/span>Yukar\u0131dan ima edildi\u011fi gibi, su\u00e7lu bu if-ifadesidir:<span class=\"ez-toc-section-end\"><\/span><\/h2>\n<pre class=\"default s-code-block hljs haskell\"><code><span class=\"hljs-title\">if<\/span> (<span class=\"hljs-class\"><span class=\"hljs-keyword\">data<\/span>[c] &gt;= 128)<\/span>\r\n    sum += <span class=\"hljs-class\"><span class=\"hljs-keyword\">data<\/span>[c];<\/span>\r\n<\/code><\/pre>\n<p>Verilerin 0 ile 255 aras\u0131nda e\u015fit olarak da\u011f\u0131t\u0131ld\u0131\u011f\u0131na dikkat edin. Veriler s\u0131raland\u0131\u011f\u0131nda, iterasyonlar\u0131n kabaca ilk yar\u0131s\u0131 if ifadesine girmeyecektir.\u00a0Bundan sonra, hepsi if ifadesini girecekler.<\/p>\n<p>\u015eube arka arkaya bir\u00e7ok kez ayn\u0131 y\u00f6ne gitti\u011fi i\u00e7in bu, \u015fube tahmincisi i\u00e7in \u00e7ok dostudur.\u00a0Basit bir doygunluk sayac\u0131 bile, y\u00f6n de\u011fi\u015ftirdikten sonraki birka\u00e7 yineleme d\u0131\u015f\u0131nda dal\u0131 do\u011fru bir \u015fekilde tahmin edecektir.<\/p>\n<p><strong>H\u0131zl\u0131 g\u00f6rselle\u015ftirme:<\/strong><\/p>\n<pre class=\"default s-code-block hljs r\"><code><span class=\"hljs-literal\">T<\/span> = branch taken\r\nN = branch not taken\r\n\r\ndata[] = <span class=\"hljs-number\">0<\/span>, <span class=\"hljs-number\">1<\/span>, <span class=\"hljs-number\">2<\/span>, <span class=\"hljs-number\">3<\/span>, <span class=\"hljs-number\">4<\/span>, <span class=\"hljs-keyword\">...<\/span> <span class=\"hljs-number\">126<\/span>, <span class=\"hljs-number\">127<\/span>, <span class=\"hljs-number\">128<\/span>, <span class=\"hljs-number\">129<\/span>, <span class=\"hljs-number\">130<\/span>, <span class=\"hljs-keyword\">...<\/span> <span class=\"hljs-number\">250<\/span>, <span class=\"hljs-number\">251<\/span>, <span class=\"hljs-number\">252<\/span>, <span class=\"hljs-keyword\">...<\/span>\r\nbranch = N  N  N  N  N  <span class=\"hljs-keyword\">...<\/span>   N    N    <span class=\"hljs-literal\">T<\/span>    <span class=\"hljs-literal\">T<\/span>    <span class=\"hljs-literal\">T<\/span>  <span class=\"hljs-keyword\">...<\/span>   <span class=\"hljs-literal\">T<\/span>    <span class=\"hljs-literal\">T<\/span>    <span class=\"hljs-literal\">T<\/span>  <span class=\"hljs-keyword\">...<\/span>\r\n\r\n       = NNNNNNNNNNNN <span class=\"hljs-keyword\">...<\/span> NNNNNNNTTTTTTTTT <span class=\"hljs-keyword\">...<\/span> TTTTTTTTTT  (easy to predict)\r\n<\/code><\/pre>\n<p>Bununla birlikte, veriler tamamen rastgele oldu\u011funda, dal tahmincisi, rastgele verileri tahmin edemedi\u011fi i\u00e7in i\u015fe yaramaz hale gelir.\u00a0Bu nedenle muhtemelen% 50 civar\u0131nda yanl\u0131\u015f tahmin olacakt\u0131r (rastgele tahmin etmekten daha iyi de\u011fildir).<\/p>\n<pre class=\"default s-code-block hljs yaml\"><code><span class=\"hljs-string\">data[]<\/span> <span class=\"hljs-string\">=<\/span> <span class=\"hljs-number\">226<\/span><span class=\"hljs-string\">,<\/span> <span class=\"hljs-number\">185<\/span><span class=\"hljs-string\">,<\/span> <span class=\"hljs-number\">125<\/span><span class=\"hljs-string\">,<\/span> <span class=\"hljs-number\">158<\/span><span class=\"hljs-string\">,<\/span> <span class=\"hljs-number\">198<\/span><span class=\"hljs-string\">,<\/span> <span class=\"hljs-number\">144<\/span><span class=\"hljs-string\">,<\/span> <span class=\"hljs-number\">217<\/span><span class=\"hljs-string\">,<\/span> <span class=\"hljs-number\">79<\/span><span class=\"hljs-string\">,<\/span> <span class=\"hljs-number\">202<\/span><span class=\"hljs-string\">,<\/span> <span class=\"hljs-number\">118<\/span><span class=\"hljs-string\">,<\/span>  <span class=\"hljs-number\">14<\/span><span class=\"hljs-string\">,<\/span> <span class=\"hljs-number\">150<\/span><span class=\"hljs-string\">,<\/span> <span class=\"hljs-number\">177<\/span><span class=\"hljs-string\">,<\/span> <span class=\"hljs-number\">182<\/span><span class=\"hljs-string\">,<\/span> <span class=\"hljs-number\">133<\/span><span class=\"hljs-string\">,<\/span> <span class=\"hljs-string\">...<\/span>\r\n<span class=\"hljs-string\">branch<\/span> <span class=\"hljs-string\">=<\/span>   <span class=\"hljs-string\">T,<\/span>   <span class=\"hljs-string\">T,<\/span>   <span class=\"hljs-string\">N,<\/span>   <span class=\"hljs-string\">T,<\/span>   <span class=\"hljs-string\">T,<\/span>   <span class=\"hljs-string\">T,<\/span>   <span class=\"hljs-string\">T,<\/span>  <span class=\"hljs-string\">N,<\/span>   <span class=\"hljs-string\">T,<\/span>   <span class=\"hljs-string\">N,<\/span>   <span class=\"hljs-string\">N,<\/span>   <span class=\"hljs-string\">T,<\/span>   <span class=\"hljs-string\">T,<\/span>   <span class=\"hljs-string\">T,<\/span>   <span class=\"hljs-string\">N<\/span>  <span class=\"hljs-string\">...<\/span>\r\n\r\n       <span class=\"hljs-string\">=<\/span> <span class=\"hljs-string\">TTNTTTTNTNNTTTN<\/span> <span class=\"hljs-string\">...<\/span>   <span class=\"hljs-string\">(completely<\/span> <span class=\"hljs-string\">random<\/span> <span class=\"hljs-bullet\">-<\/span> <span class=\"hljs-string\">hard<\/span> <span class=\"hljs-string\">to<\/span> <span class=\"hljs-string\">predict)<\/span>\r\n<\/code><\/pre>\n<hr \/>\n<p><strong>Peki ne yap\u0131labilir?<\/strong><\/p>\n<p>Derleyici, dal\u0131 ko\u015fullu bir hareket halinde optimize edemiyorsa, performans i\u00e7in okunabilirli\u011fi feda etmeye istekliysen baz\u0131 hack\u2019leri deneyebilirsin.<\/p>\n<p>De\u011fi\u015ftirin:<\/p>\n<pre class=\"default s-code-block hljs haskell\"><code><span class=\"hljs-title\">if<\/span> (<span class=\"hljs-class\"><span class=\"hljs-keyword\">data<\/span>[c] &gt;= 128)<\/span>\r\n    sum += <span class=\"hljs-class\"><span class=\"hljs-keyword\">data<\/span>[c];<\/span>\r\n<\/code><\/pre>\n<p>ile:<\/p>\n<pre class=\"default s-code-block hljs haskell\"><code><span class=\"hljs-title\">int<\/span> t = (<span class=\"hljs-class\"><span class=\"hljs-keyword\">data<\/span>[c] - 128) &gt;&gt; 31;<\/span>\r\n<span class=\"hljs-title\">sum<\/span> += ~t &amp; <span class=\"hljs-class\"><span class=\"hljs-keyword\">data<\/span>[c];<\/span>\r\n<\/code><\/pre>\n<p>Bu, dal\u0131 ortadan kald\u0131r\u0131r ve baz\u0131 bitsel i\u015flemlerle de\u011fi\u015ftirir.<\/p>\n<p><sub>(Bu hackin, orijinal if-ifadesiyle tam olarak e\u015fde\u011fer olmad\u0131\u011f\u0131n\u0131 unutmay\u0131n. Ancak bu durumda, t\u00fcm giri\u015f de\u011ferleri i\u00e7in ge\u00e7erlidir\u00a0<code>data[]<\/code>.)<\/sub><\/p>\n<p><strong>Kar\u015f\u0131la\u015ft\u0131rmalar: Core i7 920 @ 3.5 GHz<\/strong><\/p>\n<p>C ++ \u2013 Visual Studio 2010 \u2013 x64 S\u00fcr\u00fcm\u00fc<\/p>\n<pre class=\"default s-code-block hljs csharp\"><code><span class=\"hljs-comment\">\/\/  Branch - Random<\/span>\r\nseconds = <span class=\"hljs-number\">11.777<\/span>\r\n\r\n<span class=\"hljs-comment\">\/\/  Branch - Sorted<\/span>\r\nseconds = <span class=\"hljs-number\">2.352<\/span>\r\n\r\n<span class=\"hljs-comment\">\/\/  Branchless - Random<\/span>\r\nseconds = <span class=\"hljs-number\">2.564<\/span>\r\n\r\n<span class=\"hljs-comment\">\/\/  Branchless - Sorted<\/span>\r\nseconds = <span class=\"hljs-number\">2.587<\/span>\r\n<\/code><\/pre>\n<p>Java \u2013 NetBeans 7.1.1 JDK 7 \u2013 x64<\/p>\n<pre class=\"default s-code-block hljs csharp\"><code><span class=\"hljs-comment\">\/\/  Branch - Random<\/span>\r\nseconds = <span class=\"hljs-number\">10.93293813<\/span>\r\n\r\n<span class=\"hljs-comment\">\/\/  Branch - Sorted<\/span>\r\nseconds = <span class=\"hljs-number\">5.643797077<\/span>\r\n\r\n<span class=\"hljs-comment\">\/\/  Branchless - Random<\/span>\r\nseconds = <span class=\"hljs-number\">3.113581453<\/span>\r\n\r\n<span class=\"hljs-comment\">\/\/  Branchless - Sorted<\/span>\r\nseconds = <span class=\"hljs-number\">3.186068823<\/span>\r\n<\/code><\/pre>\n<p>G\u00f6zlemler:<\/p>\n<ul>\n<li><strong>Dal ile:<\/strong>\u00a0S\u0131ralanm\u0131\u015f ve s\u0131ralanmam\u0131\u015f veriler aras\u0131nda \u00e7ok b\u00fcy\u00fck bir fark vard\u0131r.<\/li>\n<li><strong>Hack ile:<\/strong>\u00a0S\u0131ralanm\u0131\u015f ve s\u0131ralanmam\u0131\u015f veriler aras\u0131nda hi\u00e7bir fark yoktur.<\/li>\n<li>C ++ durumunda, veri s\u0131raland\u0131\u011f\u0131nda kesmek asl\u0131nda daldan biraz daha yava\u015ft\u0131r.<\/li>\n<\/ul>\n<p>Genel bir pratik kural, kritik d\u00f6ng\u00fclerde (bu \u00f6rnekte oldu\u011fu gibi) verilere ba\u011fl\u0131 dallanmadan ka\u00e7\u0131nmakt\u0131r.<\/p>\n<hr \/>\n<p><strong>G\u00fcncelleme:<\/strong><\/p>\n<ul>\n<li>X64\u00a0ile\u00a0<code>-O3<\/code>veya\u00a0<code>-ftree-vectorize<\/code>x64 \u00fczerinde\u00a0GCC 4.6.1\u00a0ko\u015fullu bir hareket olu\u015fturabilir.\u00a0Dolay\u0131s\u0131yla, s\u0131ral\u0131 ve s\u0131ralanmam\u0131\u015f veriler aras\u0131nda hi\u00e7bir fark yoktur \u2013 her ikisi de h\u0131zl\u0131d\u0131r.(Ya da biraz h\u0131zl\u0131: \u00f6nceden s\u0131ralanm\u0131\u015f durum i\u00e7in,\u00a0<code>cmov<\/code>\u00f6zellikle GCC onu sadece\u00a02 d\u00f6ng\u00fc gecikmesine sahip\u00a0<code>add<\/code>Broadwell\u2019den \u00f6nce Intel\u2019de\u00a0kritik yola koyarsa daha yava\u015f olabilir\u00a0<code>cmov<\/code>:\u00a0gcc optimizasyon bayra\u011f\u0131 -O3 kodu -O2\u2019den daha yava\u015f hale getirir\u00a0)<\/li>\n<li>VC ++ 2010, bu dal i\u00e7in ko\u015fullu hareketler olu\u015fturamaz\u00a0<code>\/Ox<\/code>.<\/li>\n<li>Intel C ++ Compiler\u00a0(ICC) 11 mucizevi bir \u015fey yapar.\u00a0Bu\u00a0iki d\u00f6ng\u00fc al\u0131\u015fveri\u015fini sa\u011flar\u00a0, b\u00f6ylece d\u0131\u015f d\u00f6ng\u00fcye \u00f6ng\u00f6r\u00fclemeyen dal\u0131 kald\u0131rma.\u00a0Dolay\u0131s\u0131yla, yaln\u0131zca yanl\u0131\u015f tahminlere kar\u015f\u0131 ba\u011f\u0131\u015f\u0131kl\u0131\u011f\u0131 de\u011fil, ayn\u0131 zamanda VC ++ ve GCC\u2019nin \u00fcretebilece\u011finden iki kat daha h\u0131zl\u0131d\u0131r!\u00a0Ba\u015fka bir deyi\u015fle, ICC, \u00f6l\u00e7\u00fct\u00fc yenmek i\u00e7in test d\u00f6ng\u00fcs\u00fcnden yararland\u0131 \u2026<\/li>\n<li>Intel derleyicisine dals\u0131z kodu verirseniz, onu sa\u011f d\u0131\u015f\u0131 vekt\u00f6rle\u015ftirir \u2026 ve dalda oldu\u011fu kadar h\u0131zl\u0131d\u0131r (d\u00f6ng\u00fc de\u011fi\u015fimi ile).<\/li>\n<\/ul>\n<p>Bu, olgun modern derleyicilerin bile kodu optimize etme yeteneklerinde \u00e7\u0131lg\u0131nca de\u011fi\u015fiklik g\u00f6sterebilece\u011fini g\u00f6steriyor<\/p>\n","protected":false},"excerpt":{"rendered":"<p>Yaz\u0131l\u0131m Neden Yava\u015f \u00c7al\u0131\u015f\u0131r? Basit bir \u00f6rnek ile anlatal\u0131m \u0130\u015fte \u00e7ok tuhaf davran\u0131\u015flar g\u00f6steren bir C ++ kodu par\u00e7as\u0131. Garip bir nedenden dolay\u0131, verileri mucizevi bir \u015fekilde s\u0131ralamak, kodu neredeyse alt\u0131 kat daha h\u0131zl\u0131 hale getirir: #include #include #include int main() { \/\/ Generate data const unsigned arraySize = 32768; int data[arraySize]; for (unsigned c &hellip;<\/p>\n","protected":false},"author":1,"featured_media":2599,"comment_status":"open","ping_status":"open","sticky":false,"template":"","format":"standard","meta":{"_acf_changed":false,"footnotes":""},"categories":[36],"tags":[],"class_list":["post-2598","post","type-post","status-publish","format-standard","has-post-thumbnail","hentry","category-c"],"acf":[],"_links":{"self":[{"href":"https:\/\/sunucucozumleri.com\/blog\/wp-json\/wp\/v2\/posts\/2598","targetHints":{"allow":["GET"]}}],"collection":[{"href":"https:\/\/sunucucozumleri.com\/blog\/wp-json\/wp\/v2\/posts"}],"about":[{"href":"https:\/\/sunucucozumleri.com\/blog\/wp-json\/wp\/v2\/types\/post"}],"author":[{"embeddable":true,"href":"https:\/\/sunucucozumleri.com\/blog\/wp-json\/wp\/v2\/users\/1"}],"replies":[{"embeddable":true,"href":"https:\/\/sunucucozumleri.com\/blog\/wp-json\/wp\/v2\/comments?post=2598"}],"version-history":[{"count":0,"href":"https:\/\/sunucucozumleri.com\/blog\/wp-json\/wp\/v2\/posts\/2598\/revisions"}],"wp:featuredmedia":[{"embeddable":true,"href":"https:\/\/sunucucozumleri.com\/blog\/wp-json\/wp\/v2\/media\/2599"}],"wp:attachment":[{"href":"https:\/\/sunucucozumleri.com\/blog\/wp-json\/wp\/v2\/media?parent=2598"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"https:\/\/sunucucozumleri.com\/blog\/wp-json\/wp\/v2\/categories?post=2598"},{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/sunucucozumleri.com\/blog\/wp-json\/wp\/v2\/tags?post=2598"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}