1"use strict";(self.webpackChunkbd90=self.webpackChunkbd90||[]).push([[743],{5584:function(e,a,t){t.r(a),t.d(a,{Head:function(){return j},default:function(){return x}});var n=t(1151),r=t(7294);function i(e){const a=Object.assign({p:"p",a:"a",h2:"h2",pre:"pre",code:"code",h3:"h3",div:"div"},(0,n.ah)(),e.components);return r.createElement(r.Fragment,null,r.createElement(a.p,null,"MinÄÅa dÅuższa chwila od ostatniej publikacji bardziej technicznego wpisu ze Åwiata .NET-a. Trzeba to nadrobiÄ! Mój drogi czytelniku, zastanawiaÅeÅ siÄ kiedyÅ jak szybko dziaÅa Twój kod? Nie chodzi mi o szybkoÅÄ wykonywania request - u, czy też poprawnej optymalizacji komunikacji z bazÄ
danych, tylko o dziaÅaniu najwiÄkszego miÄcha... ten czysty kod, bez żadnych szczegóÅów architektonicznych, jak baza danych, operacje I/O czy nawet internet. Jeżeli to wÅaÅnie ten aspekt programowania zaprzÄ
ta TwojÄ
gÅowÄ, ale jeszcze nie miaÅeÅ okazji tego sprawdziÄ, teraz nadarza siÄ Åwietna okazja. W tym artykule chciaÅbym Ci przedstawiÄ jak można wykorzystaÄ bibliotekÄ ",r.createElement(a.a,{href:"https://benchmarkdotnet.org/"},"BenchmarkDotNet")," do mierzenia wydajnoÅci kodu."),"\n",r.createElement(a.h2,null,"Quick Start"),"\n",r.createElement(a.p,null,"Do rozpoczÄcie przygody z BenchmarkDotNet wystarczy stworzyÄ pustÄ
aplikacjÄ konsolowÄ
, a nastÄpnie dodaÄ do niej paczkÄ, o wybitnie zaskakujÄ
cej nazwie, BenchmarkDotNet ;) Możemy to zrobiÄ z konsoli, za pomocÄ
polecenia:"),"\n",r.createElement(a.pre,null,r.createElement(a.code,{className:"language-bash"},"$ dotnet add package BenchmarkDotNet\n")),"\n",r.createElement(a.p,null,"Tym sposobem przygotowujemy caÅe Årodowisko. Wszystko poszÅo gÅadko, no chyba, że jesteÅ za korporacyjnym proxy.... wtedy nie bÄdzie to aż tak proste :P (jeszcze kilka takich sucharów a podwórko mi wyschnie ;)"),"\n",r.createElement(a.p,null,'NastÄpnie musimy wymyÅliÄ, co bÄdziemy testowali. Na potrzeby artykuÅu zaÅóżmy, że chcemy przetestowaÄ realny wpÅyw PLINQ na czas wykonywania konkretnego zadania. Przyjmijmy, że ze zbioru 10000000 liczb planujemy wyciÄ
gnÄ
Ä tylko te, które zawierajÄ
cyfrÄ "3". Taki zbiór danych powinien wystarczyÄ, abyÅmy dostrzegli różnicÄ.'),"\n",r.createElement(a.h3,null,"Klasa testowa"),"\n",r.createElement(a.p,null,"Przejdźmy zatem do napisania klasy testowej. Nazwijmy jÄ
LINQ Benchmark"),"\n",r.createElement(a.pre,null,r.createElement(a.code,{className:"language-csharp"},'public class LinqBenchmark {\n public IEnumerable<int> numbers;\n \n public LinqBenchmark()\n {\n numbers = Enumerable.Range(1, 10000000).ToArray();\n }\n \n public int[] GetAllWithThree() {\n return numbers.Where(x => x.ToString().Contains("3"))\n .ToArray();\n }\n \n public int[] GetAllWithThreeParallel() {\n return numbers.AsParallel().Where(x => x.ToString()\n .Contains("3")).ToArray();\n }\n}\n')),"\n",r.createElement(a.p,null,"Nie ma tutaj żadnej czarnej magii, wiÄc wyjaÅnienia bÄdÄ
bardzo skrótowe. W konstruktorze tworzymy naszÄ
listÄ elementów. NastÄpnie mamy dwie metody majÄ
ce parÄ oddzielnych zapytaÅ LINQ, z czego druga implementacja wywoÅuje AsParallel() do wykorzystania mocy wspóÅbieżnoÅci."),"\n",r.createElement(a.h3,null,"Setup testów"),"\n",r.createElement(a.p,null,"MajÄ
c utworzonÄ
klasÄ testowÄ
przechodzimy do wykorzystania biblioteki BenchmarkDotNet. Zacznijmy od pliku startowego naszej aplikacji konsolowej. Konieczne jest, aby dodaÄ w nim dwa elementy: odpowiedni using czyli: ",r.createElement(a.code,null,"BenchmarkDotNet.Running"),", a także, w gÅównej metodzie naszego programu, wywoÅaÄ runner-a"),"\n",r.createElement(a.pre,null,r.createElement(a.code,{className:"language-csharp"},"static void Main(string[] args)\n{\n var summary = BenchmarkRunner.Run<LinqBenchmark>();\n}\n")),"\n",r.createElement(a.p,null,"PozostaÅo nam dorobiÄ drugiego using-a ",r.createElement(a.code,null,"BenchmarkDotNet.Attributes")," w klasie LinqBenchmark, a do metod wywoÅujÄ
cych nasze implementacje dodaÄ atrybut ",r.createElement(a.code,null,"Benchmark")),"\n",r.createElement(a.pre,null,r.createElement(a.code,{className:"language-csharp"},'[Benchmark]\npublic int[] GetAllWithThree() {\n return numbers.Where(x => x.ToString().Contains("3"))\n .ToArray();\n}\n\n[Benchmark]\npublic int[] GetAllWithThreeParallel() {\n return numbers.AsParallel().Where(x => x.ToString()\n .Contains("3")).ToArray();\n}\n')),"\n",r.createElement(a.p,null,"W ten sposób biblioteka Benchmark bÄdzie wiedzieÄ jakie metody chcemy przetestowaÄ."),"\n",r.createElement(a.h3,null,"Uruchomienie testu"),"\n",r.createElement(a.p,null,'Poprawne dziaÅanie BenchmarkDotNet wymaga uruchomienia aplikacji w trybie "Release". O różnicach pomiÄdzy trybami Debug i Release pewnie kiedyÅ napisze parÄ sÅów, na ten moment musicie mi uwierzyÄ na sÅowo. O ile dobrze pamiÄtam BenchmarkDotNet ma zabezpieczenie, by nie daÅo siÄ go uruchomiÄ w trybie Debug. Tak
1wiÄc odpalmy naszÄ
aplikacjÄ w trybie Release'),"\n",r.createElement(a.pre,null,r.createElement(a.code,{className:"language-bash"},"$ dotnet run -c Release\n")),"\n",r.createElement(a.p,null,"BenchmarkDotNet bÄdzie potrzebowaÅ chwili na przetrawienie kodu, uruchomienie go wielokrotnie w izolacji i analizÄ wyników. Po chwili na konsoli pojawi siÄ bardzo Åadnie narysowana tabelka wraz z informacjami oraz dane procesora wykorzystanego do testowania."),"\n",r.createElement(a.div,{dangerouslySetInnerHTML:{__html:'<span\n class="gatsby-resp-image-wrapper"\n style="position: relative; display: block; margin-left: auto; margin-right: auto; max-width: 600px; "\n >\n <a\n class="gatsby-resp-image-link"\n href="/static/ed4a57d2125e7f287727c11de2e8c6fb/0a47e/Zrzut-ekranu-2019-01-17-o-22.03.33-600x189.png"\n style="display: block"\n target="_blank"\n rel="noopener"\n >\n <span\n class="gatsby-resp-image-background-image"\n style="padding-bottom: 31.636363636363633%; position: relative; bottom: 0; left: 0; background-image: url(\'data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAABQAAAAGCAIAAABM9SnKAAAACXBIWXMAAAsTAAALEwEAmpwYAAAA40lEQVR42mWO22rEMAxEbUlOnFiy44ty2cCmy7L//4vFgUJp50kMmjNjHgetG50PdxxOlXLGx+FWpWN3S8KUoFZSpVapZGwVhWEcwTlrjDGt0aoUI2qjbXPTBBxABGOEeYacMQRgRhEIAZal40SAGebZGhE89p4RwZJ75gZhLRQFtpVqpbxALZjuAlWqpfeVgr3c3BOMMegnS3QfvttIlsgCdt/+PP2WRbREjnlIiZ/PsVbHEs7TMfumXtWJ8HXRjfurIcZ53+P7nT4fuS5fWzjPad2GZZHXy6v6UuT6wmH4H/4GxagOKdGqM/IAAAAASUVORK5CYII=\'); background-size: cover; display: block;"\n ></span>\n <img\n class="gatsby-resp-image-image"\n alt="Zrzut ekranu 2019 01 17 o 22 03 33 600x189"\n title="Zrzut ekranu 2019 01 17 o 22 03 33 600x189"\n src="/static/ed4a57d2125e7f287727c11de2e8c6fb/0a47e/Zrzut-ekranu-2019-01-17-o-22.03.33-600x189.png"\n srcset="/static/ed4a57d2125e7f287727c11de2e8c6fb/6b2ea/Zrzut-ekranu-2019-01-17-o-22.03.33-600x189.png 275w,\n/static/ed4a57d2125e7f287727c11de2e8c6fb/dd45a/Zrzut-ekranu-2019-01-17-o-22.03.33-600x189.png 550w,\n/static/ed4a57d2125e7f287727c11de2e8c6fb/0a47e/Zrzut-ekranu-2019-01-17-o-22.03.33-600x189.png 600w"\n sizes="(max-width: 600px) 100vw, 600px"\n style="width:100%;height:100%;margin:0;vertical-align:middle;position:absolute;top:0;left:0;"\n loading="lazy"\n decoding="async"\n />\n </a>\n </span>'}}),"\n",r.createElement(a.p,null,"Jak można byÅo siÄ spodziewaÄ, PLINQ w tym przypadku okazaÅo siÄ szybsze ;) ProszÄ jednak, byÅcie nie przerabiali teraz wszystkich zapytaÅ LINQ, ponieważ zmniejszenie liczby elementów do stu daje odwrotny wynik ;)"),"\n",r.createElement(a.div,{dangerouslySetInnerHTML:{__html:'<span\n class="gatsby-resp-image-wrapper"\n style="position: relative; display: block; margin-left: auto; margin-right: auto; max-width: 600px; "\n >\n <a\n class="gatsby-resp-image-link"\n href="/static/d219331453a4111277a671ef453294d5/0a47e/Zrzut-ekranu-2019-01-17-o-22.39.25-600x184.png"\n style="display: block"\n target="_blank"\n rel="noopener"\n >\n <span\n class="gatsby-resp-image-background-image"\n style="padding-bottom: 30.545454545454547%; position: relative; bottom: 0; left: 0; background-image: url(\'data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAABQAAAAGCAIAAABM9SnKAAAACXBIWXMAAAsTAAALEwEAmpwYAAAA3UlEQVR42m2LwXLDIAxEsSSwAVtgAcYOcS7J+Jj//7wObQ+dSfe0K72nWtO3Qz9O3ZqulUTwceq90v2uZcUYsWTaK9WNUqJSiBmnCYwZlFIqp/7gBXPqkLPgHCwz8ALWQozoPcxzv/zMEDAw8oLOgfIe6kbWdmKNwDMwYxYUQV6gbpgShgASu1My5Uyy9iKC6m/AjAPSdzEDDAPA79RmIFKf6QQAWUvez+c5iuA4uuPQCxtmWwo551ubcv5HNsxu38PrFa8rPJ+jiL+1+TynlMJ12VLcvqf3exT5lL8A+ZYOjcjonaMAAAAASUVORK5CYII=\'); background-size: cover; display: block;"\n ></span>\n <img\n class="gatsby-resp-image-image"\n alt="Zrzut ekranu 2019 01 17 o 22 39 25 600x184"\n title="Zrzut ekranu 2019 01 17 o 22 39 25 600x184"\n src="/static/d219331453a4111277a671ef453294d5/0a47e/Zrzut-ekranu-2019-01-17-o-22.39.25-600x184.png"\n srcset="/static/d219331453a4111277a671ef453294d5/6b2ea/Zrzut-ekranu-2019-01-17-o-22.39.25-600x184.png 275w,\n/static/d219331453a4111277a671ef453294d5/
1dd45a/Zrzut-ekranu-2019-01-17-o-22.39.25-600x184.png 550w,\n/static/d219331453a4111277a671ef453294d5/0a47e/Zrzut-ekranu-2019-01-17-o-22.39.25-600x184.png 600w"\n sizes="(max-width: 600px) 100vw, 600px"\n style="width:100%;height:100%;margin:0;vertical-align:middle;position:absolute;top:0;left:0;"\n loading="lazy"\n decoding="async"\n />\n </a>\n </span>'}}),"\n",r.createElement(a.p,null,"To by byÅo na tyle jeżeli chodzi o wprowadzenie do testowania wydajnoÅci kodu C#. Mam nadzieje że artykuÅ siÄ podobaÅ ;)"),"\n",r.createElement(a.p,null,"Do NastÄpnego!"),"\n",r.createElement(a.p,null,"CzeÅÄ"))}var o=function(e){void 0===e&&(e={});const{wrapper:a}=Object.assign({},(0,n.ah)(),e.components);return a?r.createElement(a,e,r.createElement(i,e)):i(e)},l=t(5785),c=t(7604),m=t(4001),s=t(4534),d=t(2809),u=t(3662),p=t(515),g=t(3707),y=t(2110),z=t(6245),w=t(3723),k=t(120),b=t(8926),h=t(9313);const A="https://bd90.pl",E=["stycznia","lutego","marca","kwietnia","maja","czerwca","lipca","sierpnia","wrzeÅnia","października","listopada","grudnia"],f=e=>{var a;let{data:t,children:n}=e;const i=(0,w.c)(t.mdx.frontmatter.hero_image),o=t.mdx.frontmatter.categories||[],m=t.mdx.frontmatter.slug,A=new Set(o),f=((null===(a=t.related)||void 0===a?void 0:a.nodes)||[]).filter((e=>e.frontmatter.slug!==m)),j=f.filter((e=>(e.frontmatter.categories||[]).some((e=>A.has(e))))).slice(0,3);for(const r of f){if(j.length>=3)break;j.includes(r)||j.push(r)}return r.createElement(c.Z,{pageTitle:t.mdx.frontmatter.title,displayCover:!1},r.createElement("div",{className:h.Y2},r.createElement("header",{className:h.YM},r.createElement(g.Z,{items:[{name:"Strona gÅówna",to:"/"}].concat((0,l.Z)(o[0]?[{name:o[0],to:(0,k.c)(o[0])}]:[]),[{name:t.mdx.frontmatter.title}])}),r.createElement("h1",{className:h.TN},t.mdx.frontmatter.title),r.createElement("div",{className:h.$y},r.createElement("span",null,(e=>{const a=new Date(e);return isNaN(a.getTime())?e:a.getDate()+" "+E[a.getMonth()]+" "+a.getFullYear()})(t.mdx.frontmatter.date)),r.createElement("span",{className:h.AK,"aria-hidden":"true"},"·"),r.createElement("span",null,"Kamil KieÅbasa"))),i&&r.createElement(w.G,{className:h.rP,image:i,alt:t.mdx.frontmatter.hero_image_alt||t.mdx.frontmatter.title}),r.createElement("article",{className:b.rA+" "+h.yF},n),r.createElement("div",{className:h.M},r.createElement(d.Z,{items:t.mdx.frontmatter.references}),r.createElement(s.Z,{date:t.mdx.frontmatter.date,categories:t.mdx.frontmatter.categories,url:"https://bd90.pl/"+t.mdx.frontmatter.slug,title:t.mdx.frontmatter.title,description:t.mdx.excerpt}),r.createElement("section",{style:{marginTop:"2.5rem"}},r.createElement(z.Z,null)),j.length>0&&r.createElement("section",{className:h.zY},r.createElement("div",{className:h.kK},r.createElement("span",{className:"bd-eyebrow"},"Czytaj dalej"),r.createElement("h2",{className:h.JR},"PowiÄ zane wpisy")),r.createElement("div",{className:h.aM},j.map((e=>r.createElement(p.Z,{key:e.id,id:e.id,slug:e.frontmatter.slug,title:e.frontmatter.title,excerpt:e.excerpt,date:e.frontmatter.date,hero:{image:e.frontmatter.hero_image,alt:e.frontmatter.title},categories:e.frontmatter.categories,variant:"card"}))))),r.createElement("section",{style:{marginTop:"2.5rem"}},r.createElement(u.Z,null)),r.createElement("section",{style:{marginTop:"2.5rem"}},r.createElement(y.Z,{config:{url:"https://bd90.pl/"+t.mdx.frontmatter.slug,identifier:t.mdx.frontmatter.slug,title:t.mdx.frontmatter.title}})))))},j=e=>{var a,t;let{data:n}=e;const i=(0,w.c)(n.mdx.frontmatter.hero_image),o=null===(a=n.mdx.frontmatter.categories)||void 0===a?void 0:a[0];return r.createElement(m.Z,{title:n.mdx.frontmatter.title,description:n.mdx.excerpt,hero:null==i||null===(t=i.images.fallback)||void 0===t?void 0:t.src,heroType:n.mdx.frontmatter.hero_image_type,slug:n.mdx.frontmatter.slug,publishedTime:n.mdx.frontmatter.date,type:"article",width:null!=i&&i.width?String(i.width):void 0,height:null!=i&&i.height?String(i.height):void 0,breadcrumbs:[{name:"Strona gÅówna",url:A+"/"}].concat((0,l.Z)(o?[{name:o,url:""+A+(0,k.c)(o)+"/"}]:[]),[{name:n.mdx.frontmatter.title}])})};function x(e){return r.createElement(f,e,r.createElement(o,e))}}}]); 2//# sourceMappingURL=component---src-pages-mdx-frontmatter-slug-tsx-content-file-path-workspace-linecode-bd-90-blog-2019-01-20-benchmarkdotnet-jak-sprawdzic-szybkosc-index-mdx-19ccf51421d7779a84cf.js.map
Line numbers count LF bytes from the start of the resource, as the search results do. Vendor segments are library code the classifier recognised; they are stored but not indexed. Bytes are shown as Latin1 characters, one per byte.