﻿
{"id":16285,"date":"2020-06-21T22:47:02","date_gmt":"2020-06-21T22:47:02","guid":{"rendered":"https:\/\/www.gencayyildiz.com\/blog\/?p=16285"},"modified":"2020-06-27T15:12:52","modified_gmt":"2020-06-27T15:12:52","slug":"net-core-span-ve-memory-turleri-nedir","status":"publish","type":"post","link":"https:\/\/www.gencayyildiz.com\/blog\/net-core-span-ve-memory-turleri-nedir\/","title":{"rendered":".NET Core &#8211; Span<T> ve Memory<T> T\u00fcrleri Nedir?"},"content":{"rendered":"<div id=\"fb-root\"><\/div>\n<p>Merhaba,<\/p>\n<p>Bu i\u00e7eri\u011fimizde, STACK yahut HEAP farketmeksizin bellekte ard\u0131\u015f\u0131l olarak tan\u0131mlanm\u0131\u015f belirli bir b\u00f6lgeye tip g\u00fcvenli\u011fiyle eri\u015fmemizi sa\u011flayan <strong>Span&lt;T&gt;<\/strong> ve onun belirli k\u0131s\u0131tlamalardan ar\u0131nd\u0131r\u0131lm\u0131\u015f muadili olan <strong>Memory&lt;T&gt;<\/strong> struct t\u00fcrlerini inceliyor olaca\u011f\u0131z.<\/p>\n<h4>Nedir bu Span&lt;T&gt; T\u00fcr\u00fc?<\/h4>\n<p><a href=\"https:\/\/www.gencayyildiz.com\/blog\/wp-content\/uploads\/2020\/06\/NET-Core-Span-ve-Memory-T\u00fcrleri-Nedir..jpg\"><img loading=\"lazy\" decoding=\"async\" src=\"https:\/\/www.gencayyildiz.com\/blog\/wp-content\/uploads\/2020\/06\/NET-Core-Span-ve-Memory-T\u00fcrleri-Nedir.-300x112.jpg\" alt=\".NET Core - Span&lt;T&gt; ve Memory&lt;T&gt; T\u00fcrleri Nedir?\" width=\"300\" height=\"112\" class=\"alignleft size-medium wp-image-16297\" srcset=\"https:\/\/www.gencayyildiz.com\/blog\/wp-content\/uploads\/2020\/06\/NET-Core-Span-ve-Memory-T\u00fcrleri-Nedir.-300x112.jpg 300w, https:\/\/www.gencayyildiz.com\/blog\/wp-content\/uploads\/2020\/06\/NET-Core-Span-ve-Memory-T\u00fcrleri-Nedir.-768x287.jpg 768w, https:\/\/www.gencayyildiz.com\/blog\/wp-content\/uploads\/2020\/06\/NET-Core-Span-ve-Memory-T\u00fcrleri-Nedir..jpg 887w\" sizes=\"auto, (max-width: 300px) 100vw, 300px\" \/><\/a><br \/>\nBellek \u00fczerinde belirli bir alan\u0131 temsil ederek i\u015flemler ger\u00e7ekle\u015ftirmemizi sa\u011flayan bir struct&#8217;t\u0131r. Bu belirli bir alandan kast\u0131m\u0131z tabi ki de bellekte ard\u0131\u015f\u0131l alan kaplayan array de\u011ferleridir. Biliyorsunuz ki en sade haliyle array&#8217;ler belle\u011fin managed b\u00f6lgesi olan HEAP&#8217;de tutulmakta, bunu STACK&#8217;te ger\u00e7ekle\u015ftirebilmek i\u00e7in ise <a href=\"https:\/\/www.gencayyildiz.com\/blog\/cta-gostericipointer-stackalloc-anahtar-sozcugu-ix\/\" rel=\"noopener noreferrer\" target=\"_blank\">stackalloc<\/a> keyword\u00fcnden yararlan\u0131lmaktad\u0131r. Bu bilgiler \u0131\u015f\u0131\u011f\u0131nda Span, stack yahut heap farketmeksizin tan\u0131mlanm\u0131\u015f olan array&#8217;in t\u00fcm\u00fcn\u00fc yahut bir b\u00f6l\u00fcm\u00fcn\u00fc bizler i\u00e7in refere edebilen ve \u00fczerinde i\u015flemler ger\u00e7ekle\u015ftirmemizi sa\u011flayabilen kullan\u0131\u015fl\u0131 bir yap\u0131d\u0131r.<\/p>\n<p>Evet, stack ve heap b\u00f6lgelerinde tan\u0131mlanm\u0131\u015f array&#8217;ler \u00fczerinde tamam\u0131n\u0131 yahut bir b\u00f6l\u00fcm\u00fcn\u00fc refere ederek ortak i\u015f yapabilmesi kullan\u0131\u015fl\u0131l\u0131k a\u00e7\u0131s\u0131ndan olduk\u00e7a verimlilik, bu refere esnas\u0131nda bellekte ekstradan alan tahsisinde bulunup l\u00fczumsuz de\u011fer \u00fcretimine girmemesi performans ve maliyet a\u00e7\u0131s\u0131ndan da y\u00fcksek kazan\u00e7 getirmektedir.<\/p>\n<p><strong>Peki Span ile hangi sorunlara \u00e7\u00f6z\u00fcm getirilmektedir?<\/strong><br \/>\nBurada \u00f6rnek olarak esas\u0131nda direkt bir sorun kabul edilemeyecek string veri yap\u0131s\u0131n\u0131 ele alabiliriz. string bir immutable(de\u011fi\u015fmez) t\u00fcr oldu\u011fu i\u00e7in string bir ifade \u00fczerinde yap\u0131lan t\u00fcm faaliyetler mevcut verinin kopyalanmas\u0131na ve b\u00f6ylece yeni bir de\u011fer \u00fcretimine sebep olacakt\u0131r. Dolay\u0131s\u0131yla bu durum b\u00fcy\u00fck de\u011ferlerde \u00e7ok daha b\u00fcy\u00fck maliyetlere sebep olmakla birlikte teselli olarak StringBuilder gibi nesnelerin k\u0131ymeti harbiyesini artt\u0131rmaktad\u0131r.<\/p>\n<p>Span, string gibi maliyetli veriler \u00fczerinde yap\u0131lacak operasyonlarda performans a\u00e7\u0131s\u0131ndan y\u00fcksek getiriyle birlikte maliyeti olabildi\u011fince d\u00fc\u015f\u00fcrmekte ve ekstradan de\u011fer kopyalamaya gerek kalmaks\u0131z\u0131n t\u00fcm faaliyetleri ger\u00e7ekle\u015ftirmemize olanak sa\u011flamaktad\u0131r. <\/p>\n<p><strong>Peki Span nas\u0131l olu\u015fturulur?<\/strong><br \/>\nSpan tan\u0131mlayabilmek i\u00e7in a\u015fa\u011f\u0131daki gibi \u00e7al\u0131\u015fmas\u0131<\/p>\n<pre class=\"brush: jscript; title: ; notranslate\" title=\"\">\r\n            int&#x5B;] numbers = { 3, 5, 7, 9, 11, 13, 15, 17, 19, 21, 23, 25 };\r\n            Span&lt;int&gt; span = numbers;\r\n<\/pre>\n<p>ya da a\u015fa\u011f\u0131daki gibi Array t\u00fcrlerde olan AsSpan fonksiyonunun \u00e7a\u011fr\u0131lmas\u0131<\/p>\n<pre class=\"brush: jscript; title: ; notranslate\" title=\"\">\r\n            int&#x5B;] numbers = { 3, 5, 7, 9, 11, 13, 15, 17, 19, 21, 23, 25 };\r\n            Span&lt;int&gt; span = numbers.AsSpan();\r\n<\/pre>\n<p>yeterlidir.<\/p>\n<p>Tabi bu \u015fekilde tan\u0131mlamalar ilgili dizinin tamam\u0131na kar\u015f\u0131l\u0131k gelmektedir. E\u011fer ki dizinin bir b\u00f6l\u00fcm\u00fcne kar\u015f\u0131l\u0131k gelen Span tan\u0131mlamak istiyorsan\u0131z;<\/p>\n<pre class=\"brush: jscript; title: ; notranslate\" title=\"\">\r\n            int&#x5B;] numbers = { 3, 5, 7, 9, 11, 13, 15, 17, 19, 21, 23, 25 };\r\n            Span&lt;int&gt; span = new Span&lt;int&gt;(array: numbers, start: 3, length: 5);\r\n<\/pre>\n<p>ya da<\/p>\n<pre class=\"brush: jscript; title: ; notranslate\" title=\"\">\r\n            int&#x5B;] numbers = { 3, 5, 7, 9, 11, 13, 15, 17, 19, 21, 23, 25 };\r\n            Span&lt;int&gt; span = numbers.AsSpan(start: 3, length: 5);\r\n<\/pre>\n<p>\u015feklinde \u00e7al\u0131\u015fabilirsiniz.<\/p>\n<p>Bu \u015fekilde tan\u0131mlanan Span art\u0131k ilgili array referans\u0131 ile ayn\u0131 nesneyi temsil etmekte ve \u00fczerinden yap\u0131lan t\u00fcm i\u015flemleri fiziksel olarak array&#8217;e i\u015flemektedir.<\/p>\n<pre class=\"brush: jscript; title: ; notranslate\" title=\"\">\r\n            int&#x5B;] numbers = { 3, 5, 7, 9, 11, 13, 15, 17, 19, 21, 23, 25 };\r\n            Span&lt;int&gt; span = numbers;\r\n            numbers.ToList().ForEach(n =&gt; Console.WriteLine(n));\r\n\r\n            Console.WriteLine(&quot;****************&quot;);\r\n\r\n            span&#x5B;0] = 100;\r\n            span&#x5B;5] = 200;\r\n            span&#x5B;10] = 300;\r\n            numbers.ToList().ForEach(n =&gt; Console.WriteLine(n));\r\n<\/pre>\n<div style=\"text-align:center;\">\n<div style=\"background-color:black;color:white;text-align:center;width:100px;margin:auto;margin:auto;font-size:10px;line-height: 10px;\">\n3<br \/>\n5<br \/>\n7<br \/>\n9<br \/>\n11<br \/>\n13<br \/>\n15<br \/>\n17<br \/>\n19<br \/>\n21<br \/>\n23<br \/>\n25<br \/>\n****************<br \/>\n100<br \/>\n5<br \/>\n7<br \/>\n9<br \/>\n11<br \/>\n200<br \/>\n15<br \/>\n17<br \/>\n19<br \/>\n21<br \/>\n300<br \/>\n25\n<\/div>\n<\/div>\n<p>Elimizde bulunan herhangi bir Span de\u011feri \u00fczerinden yeni bir Span yaratabilmek i\u00e7in ise Slice metodu kullan\u0131labilir.<\/p>\n<pre class=\"brush: jscript; title: ; notranslate\" title=\"\">\r\n            int&#x5B;] numbers = { 3, 5, 7, 9, 11, 13, 15, 17, 19, 21, 23, 25 };\r\n            Span&lt;int&gt; span = numbers;\r\n            Span&lt;int&gt; span2 = span.Slice(3, 5);\r\n<\/pre>\n<h4 style=\"color:orange;\">ReadOnlySpan&lt;T&gt;<\/h4>\n<p>Span niteliklerinin t\u00fcm\u00fcn\u00fc sa\u011flamakta lakin ad\u0131 \u00fczerinde sadece okunabilir k\u0131lmaktad\u0131r. A\u015fa\u011f\u0131daki gibi tan\u0131mlama yap\u0131ld\u0131\u011f\u0131 taktirde kod derlenmeyecektir.<\/p>\n<pre class=\"brush: jscript; title: ; notranslate\" title=\"\">\r\n            int&#x5B;] numbers = { 3, 5, 7, 9, 11, 13, 15, 17, 19, 21, 23, 25 };\r\n            ReadOnlySpan&lt;int&gt; span = numbers;\r\n            span&#x5B;0] = 100;\r\n<\/pre>\n<p>ReadOnlySpan sayesinde bir dizideki yahut metindeki belirli bir alan\u0131 elde edebiliyor ve bir yandan da de\u011fi\u015ftirilmesine kar\u015f\u0131 orjinal veriyi g\u00fcvenceye alabiliyorsunuz.<\/p>\n<h4 style=\"color:orange;\">Stackalloc \u0130le Span Kullan\u0131m\u0131<\/h4>\n<p>\u0130\u00e7eri\u011fimizin ba\u015flar\u0131nda stackalloc ile belle\u011fin stack b\u00f6lgesinde olu\u015fturulan array&#8217;i Span ile temsil edebildi\u011fimizden bahsettik. Bunun i\u00e7in normalde a\u015fa\u011f\u0131daki gibi unsafe komutu ile olu\u015fturulan dizi<\/p>\n<pre class=\"brush: jscript; title: ; notranslate\" title=\"\">\r\n            unsafe\r\n            {\r\n                int* p = stackalloc int&#x5B;3];\r\n                for (int i = 0; i &lt; 3; i++)\r\n                {\r\n                    Console.WriteLine(p&#x5B;i] = i * 5);\r\n                }\r\n            }\r\n<\/pre>\n<p>a\u015fa\u011f\u0131daki gibi Span ile unsafe kullanmaks\u0131z\u0131n tan\u0131mlanabilmekte ve refere edilebilmektedir.<\/p>\n<pre class=\"brush: jscript; title: ; notranslate\" title=\"\">\r\n            Span&lt;int&gt; p = stackalloc int&#x5B;3];\r\n            for (int i = 0; i &lt; 3; i++)\r\n            {\r\n                Console.WriteLine(p&#x5B;i] = i * 5);\r\n            }\r\n<\/pre>\n<h4 style=\"color:orange;\">Memory&lt;T&gt;<\/h4>\n<p>Span, <code>ref struct<\/code> olarak tasarlanm\u0131\u015f bir struct&#8217;t\u0131r. Dolay\u0131s\u0131yla heap&#8217;te allocation(tahsis) edilememektedir. Ayr\u0131ca object, dynamic veya interface t\u00fcrleri arac\u0131l\u0131\u011f\u0131yla referans edilememekte, await ile kullan\u0131lamamakta ve bir class i\u00e7erisinde field yahut property olarak tan\u0131mlanamamaktad\u0131r. Span&#8217;\u0131n bu k\u0131s\u0131tlamalardan m\u00fcnezzeh muadili olan Memory ve onunda sadece okunabilir olarak geli\u015ftirilmi\u015f t\u00fcr\u00fc olan ReadOnlyMemory structlar\u0131 geli\u015ftirilmi\u015ftir.<\/p>\n<p>\u0130lgilenenlerin faydalanmas\u0131 dile\u011fiyle&#8230;<br \/>\nSonraki yaz\u0131lar\u0131mda g\u00f6r\u00fc\u015fmek \u00fczere&#8230;<br \/>\n\u0130yi \u00e7al\u0131\u015fmalar&#8230;<\/p>\n<p>Kaynaklar<br \/>\nhttp:\/\/www.umutozel.com\/span-memory<br \/>\nhttps:\/\/docs.microsoft.com\/tr-tr\/dotnet\/api\/system.span-1?view=netcore-3.1<br \/>\nhttps:\/\/www.ilkayilknur.com\/net-coreda-span-ve-memory-tipleri<\/p>\n<!-- AddThis Advanced Settings generic via filter on the_content --><!-- AddThis Share Buttons generic via filter on the_content -->","protected":false},"excerpt":{"rendered":"<p>Merhaba, Bu i\u00e7eri\u011fimizde, STACK yahut HEAP farketmeksizin bellekte ard\u0131\u015f\u0131l olarak tan\u0131mlanm\u0131\u015f belirli bir b\u00f6lgeye tip g\u00fcvenli\u011fiyle eri\u015fmemizi sa\u011flayan Span&lt;T&gt; ve onun belirli k\u0131s\u0131tlamalardan ar\u0131nd\u0131r\u0131lm\u0131\u015f muadili olan Memory&lt;T&gt; struct t\u00fcrlerini inceliyor olaca\u011f\u0131z. Nedir bu Span&lt;T&gt;&#46;&#46;&#46;<!-- AddThis Advanced Settings generic via filter on get_the_excerpt --><!-- AddThis Share Buttons generic via filter on get_the_excerpt --><\/p>\n","protected":false},"author":1,"featured_media":16297,"comment_status":"open","ping_status":"open","sticky":false,"template":"","format":"standard","meta":{"footnotes":""},"categories":[2739,12],"tags":[3571,3572,3570],"class_list":["post-16285","post","type-post","status-publish","format-standard","has-post-thumbnail","hentry","category-net-core","category-c-sharp-c","tag-memory","tag-readonlyspan","tag-span"],"amp_enabled":true,"_links":{"self":[{"href":"https:\/\/www.gencayyildiz.com\/blog\/wp-json\/wp\/v2\/posts\/16285","targetHints":{"allow":["GET"]}}],"collection":[{"href":"https:\/\/www.gencayyildiz.com\/blog\/wp-json\/wp\/v2\/posts"}],"about":[{"href":"https:\/\/www.gencayyildiz.com\/blog\/wp-json\/wp\/v2\/types\/post"}],"author":[{"embeddable":true,"href":"https:\/\/www.gencayyildiz.com\/blog\/wp-json\/wp\/v2\/users\/1"}],"replies":[{"embeddable":true,"href":"https:\/\/www.gencayyildiz.com\/blog\/wp-json\/wp\/v2\/comments?post=16285"}],"version-history":[{"count":36,"href":"https:\/\/www.gencayyildiz.com\/blog\/wp-json\/wp\/v2\/posts\/16285\/revisions"}],"predecessor-version":[{"id":16392,"href":"https:\/\/www.gencayyildiz.com\/blog\/wp-json\/wp\/v2\/posts\/16285\/revisions\/16392"}],"wp:featuredmedia":[{"embeddable":true,"href":"https:\/\/www.gencayyildiz.com\/blog\/wp-json\/wp\/v2\/media\/16297"}],"wp:attachment":[{"href":"https:\/\/www.gencayyildiz.com\/blog\/wp-json\/wp\/v2\/media?parent=16285"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"https:\/\/www.gencayyildiz.com\/blog\/wp-json\/wp\/v2\/categories?post=16285"},{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/www.gencayyildiz.com\/blog\/wp-json\/wp\/v2\/tags?post=16285"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}