<?xml version="1.0" encoding="utf-8" standalone="yes"?><rss version="2.0" xmlns:atom="http://www.w3.org/2005/Atom" xmlns:content="http://purl.org/rss/1.0/modules/content/"><channel><title>Performance | The .NET Blog</title><link>https://thedotnetblog.com/nl/tags/performance/</link><description>Articles, tutorials and insights from the .NET community.</description><generator>Hugo</generator><language>nl</language><managingEditor>@thedotnetblog (The .NET Blog)</managingEditor><webMaster>@thedotnetblog</webMaster><lastBuildDate>Tue, 26 May 2026 00:00:00 +0000</lastBuildDate><atom:link href="https://thedotnetblog.com/nl/tags/performance/index.xml" rel="self" type="application/rss+xml"/><item><title>.NET 11 repareert eindelijk de Proces-API</title><link>https://thedotnetblog.com/nl/news/emiliano-montesdeoca/dotnet-11-process-api-improvements-runandcapturetext/</link><pubDate>Tue, 26 May 2026 00:00:00 +0000</pubDate><author>Emiliano Montesdeoca</author><guid>https://thedotnetblog.com/nl/news/emiliano-montesdeoca/dotnet-11-process-api-improvements-runandcapturetext/</guid><description>System.Diagnostics.Process krijgt zijn grootste update in jaren. RunAndCaptureTextAsync, KillOnParentExit, SafeProcessHandle-API's en volledige controle over standaard handle-omleiding — geen deadlock-boilerplate meer.</description><content:encoded>&lt;p&gt;Elke .NET-ontwikkelaar die ooit een proces moest starten en de uitvoer ervan moest vastleggen, heeft een variatie op dezelfde gevaarlijke boilerplate geschreven: async lezen van stdout, async lezen van stderr, &lt;code&gt;WaitForExitAsync&lt;/code&gt;, vergeet niet beide streams te leegmaken of je krijgt een deadlock. Het is een bekende val die al jaren bestaat.&lt;/p&gt;
&lt;p&gt;.NET 11 lost dit eindelijk goed op.&lt;/p&gt;
&lt;h2 id="runandcapturetextasync"&gt;RunAndCaptureTextAsync&lt;/h2&gt;
&lt;p&gt;De belangrijkste toevoeging: één enkele statische methode die een proces start, stdout en stderr vastlegt, en wacht op beëindiging zonder deadlock.&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;pre tabindex="0" class="chroma"&gt;&lt;code class="language-csharp" data-lang="csharp"&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="kt"&gt;var&lt;/span&gt; &lt;span class="n"&gt;result&lt;/span&gt; &lt;span class="p"&gt;=&lt;/span&gt; &lt;span class="k"&gt;await&lt;/span&gt; &lt;span class="n"&gt;Process&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;RunAndCaptureTextAsync&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="s"&gt;&amp;#34;dotnet&amp;#34;&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="s"&gt;&amp;#34;--version&amp;#34;&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="n"&gt;Console&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;WriteLine&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;result&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;StandardOutput&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;Één aanroep. Geen handmatig leegmaken van streams. Geen zorgvuldig geplaatste &lt;code&gt;WaitForExit&lt;/code&gt;. Als u gewoon iets wilt uitvoeren en de uitvoer wilt ontvangen, is dit de API die u wilt.&lt;/p&gt;
&lt;p&gt;Er is ook &lt;code&gt;Process.RunAsync&lt;/code&gt; voor het geval u wilt wachten op beëindiging zonder de uitvoer te vastleggen.&lt;/p&gt;
&lt;h2 id="killonparentexit"&gt;KillOnParentExit&lt;/h2&gt;
&lt;p&gt;Een veelvoorkomend probleem met gestarte processen: als het bovenliggende proces crasht of wordt beëindigd, blijven de onderliggende processen als wezen draaien. &lt;code&gt;KillOnParentExit&lt;/code&gt; stelt u in staat om bij het starten van het proces te declareren dat het onderliggende proces beëindigd moet worden wanneer het bovenliggende proces wordt beëindigd.&lt;/p&gt;
&lt;p&gt;Dit is een functie die op platformspecifieke manieren bestond (job objects op Windows, prctl op Linux) maar p/invoke of externe bibliotheken vereiste voor gebruik vanuit .NET. Nu is het een eersteklas eigenschap op &lt;code&gt;ProcessStartInfo&lt;/code&gt;.&lt;/p&gt;
&lt;h2 id="safeprocesshandle-gebaseerde-apis"&gt;SafeProcessHandle-gebaseerde API&amp;rsquo;s&lt;/h2&gt;
&lt;p&gt;Het nieuwe lichtgewicht API-oppervlak is gebouwd rond &lt;code&gt;SafeProcessHandle&lt;/code&gt; in plaats van de volledige klasse &lt;code&gt;Process&lt;/code&gt;. De volledige klasse &lt;code&gt;Process&lt;/code&gt; draagt veel toestand met zich mee en is moeilijk te trimmen — het &lt;code&gt;SafeProcessHandle&lt;/code&gt;-pad is trimmer-vriendelijker voor toepassingen die de uitvoergrootte moeten minimaliseren (WASM, native AOT).&lt;/p&gt;
&lt;h2 id="volledige-controle-over-handle-erfenis"&gt;Volledige Controle over Handle-erfenis&lt;/h2&gt;
&lt;p&gt;De update voegt ook gedetailleerde controle toe over welke handles een onderliggend proces erft en hoe standaard handles worden omgeleid. Voorheen kon u stdin/stdout/stderr omleiden, maar kon u niet precies specificeren welke handles op OS-niveau geërfd worden. De nieuwe API&amp;rsquo;s stellen die controle bloot.&lt;/p&gt;
&lt;h2 id="waarom-dit-belangrijk-is"&gt;Waarom Dit Belangrijk Is&lt;/h2&gt;
&lt;p&gt;De klasse &lt;code&gt;Process&lt;/code&gt; wordt gebruikt in tooling, buildsystemen, testrunners en elke toepassing die andere uitvoerbare bestanden aanroept. Het oude API-oppervlak dateerde uit het .NET Framework-tijdperk en toonde zijn leeftijd. Dit is geen afbrekende wijziging — de oude API&amp;rsquo;s werken nog steeds — maar nieuwe code moet de voorkeur geven aan het nieuwe oppervlak.&lt;/p&gt;
&lt;p&gt;Voor getrimde toepassingen of AOT-compilatiescenario&amp;rsquo;s is het &lt;code&gt;SafeProcessHandle&lt;/code&gt;-pad bijzonder welkom. De oude klasse &lt;code&gt;Process&lt;/code&gt; bracht veel reflection-zwaar code mee dat het trimmen bemoeilijkte.&lt;/p&gt;
&lt;p&gt;Originele post: &lt;a href="https://devblogs.microsoft.com/dotnet/process-api-improvements-in-dotnet-11/"&gt;Process API Improvements in .NET 11&lt;/a&gt;&lt;/p&gt;</content:encoded></item><item><title>Hoe Copilot Studio Migreerde naar .NET 10 WebAssembly en 20% Sneller Werd</title><link>https://thedotnetblog.com/nl/news/emiliano-montesdeoca/copilot-studio-net10-webassembly-migration-performance/</link><pubDate>Sat, 23 May 2026 00:00:00 +0000</pubDate><author>Emiliano Montesdeoca</author><guid>https://thedotnetblog.com/nl/news/emiliano-montesdeoca/copilot-studio-net10-webassembly-migration-performance/</guid><description>De verbeteringen van .NET 10 WASM zijn niet alleen voor nieuwe projecten. Dit is wat Copilot Studio mat na de upgrade van .NET 8: automatische fingerprinting, WasmStripILAfterAOT standaard ingeschakeld en echte uitvoeringsprestaties.</description><content:encoded>&lt;p&gt;Het Copilot Studio-team deed iets waar alle Blazor WASM-ontwikkelaars nieuwsgierig naar waren: ze upgradeden daadwerkelijk een productieapplicatie van .NET 8 naar .NET 10 en maten de resultaten. De post deelt specifieke cijfers, wat zeldzaam en oprecht nuttig is.&lt;/p&gt;
&lt;h2 id="de-upgrade-was-saai-dat-is-een-goede-zaak"&gt;De Upgrade Was Saai (Dat is een Goede Zaak)&lt;/h2&gt;
&lt;p&gt;Target framework bijwerken, pakketreferenties vernieuwen, breaking changes oplossen. Dat is alles. De .NET 10-build draait nu in productie. De migratie zelf was niet het interessante deel — de wijzigingen in .NET 10 zijn dat.&lt;/p&gt;
&lt;h2 id="automatische-asset-fingerprinting"&gt;Automatische Asset Fingerprinting&lt;/h2&gt;
&lt;p&gt;Vroeger betekende het distribueren van een WASM-app het schrijven van aangepaste scripts om gepubliceerde assets te hernoemen met SHA256-hashes voor cache-busting. Copilot Studio had een PowerShell-script dat precies dit deed — bestanden hernoemen, &lt;code&gt;integrity&lt;/code&gt;-attributen injecteren in de JavaScript-loader, alles handmatig beheren.&lt;/p&gt;
&lt;p&gt;In .NET 10 is dit allemaal ingebouwd. Gepubliceerde assets krijgen automatisch een fingerprint, worden direct geïmporteerd vanuit &lt;code&gt;dotnet.js&lt;/code&gt; en worden gevalideerd op integriteit zonder handmatige tussenkomst. Het team verwijderde het hernoem-script.&lt;/p&gt;
&lt;p&gt;Kleine verandering in scope, aanzienlijke vermindering van complexiteit.&lt;/p&gt;
&lt;h2 id="wasmstripilafteraot-is-nu-standaard-ingeschakeld"&gt;WasmStripILAfterAOT Is Nu Standaard Ingeschakeld&lt;/h2&gt;
&lt;p&gt;In .NET 8 was het verwijderen van IL uit AOT-gecompileerde assemblies opt-in. In .NET 10 is het de standaard. Na AOT-compilatie wordt de oorspronkelijke IL-bytecode verwijderd uit de uitvoer — het is niet nodig tijdens runtime, en het bewaren ervan blies de pakketgrootte op zonder reden.&lt;/p&gt;
&lt;p&gt;Copilot Studio gebruikt een specifieke optimalisatie: het levert zowel een JIT-engine (snelle opstart) als een AOT-engine (maximale steady-state prestaties), laadt beide parallel en geeft over van JIT naar AOT zodra het klaar is. Het dedupliceert ook bestanden die identiek zijn tussen de twee engines.&lt;/p&gt;
&lt;p&gt;Het nieuwe IL-stripping gedrag betekent dat AOT-assemblies niet meer bit-voor-bit overeenkomen met hun JIT-tegenhangers, dus worden er minder bestanden gededupliceerd:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;.NET 8: 59 gedeelde bestanden&lt;/li&gt;
&lt;li&gt;.NET 10: 22 gedeelde bestanden&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;Nettoresultaat: pakketgrootte ongeveer 15% groter voor de AOT-engine. De AOT-download is ~6% langzamer op snel LAN, ~17% langzamer op 4G. Maar dit alles gebeurt op de achtergrond nadat de app al interactief is.&lt;/p&gt;
&lt;h2 id="de-prestatiecijfers"&gt;De Prestatiecijfers&lt;/h2&gt;
&lt;p&gt;Dit is het deel dat telt:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;~20% sneller&lt;/strong&gt; bij de eerste aanroep (koud pad)&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;~5% sneller&lt;/strong&gt; bij volgende aanroepen (warm pad)&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;De verbeteringen zijn het meest zichtbaar in &amp;ldquo;grote bots&amp;rdquo; — grote, complexe agents waar AOT-gecompileerde code domineert. Voor eenvoudigere workflows is de winst kleiner.&lt;/p&gt;
&lt;h2 id="als-u-nog-op-net-8-bent"&gt;Als U Nog op .NET 8 Bent&lt;/h2&gt;
&lt;p&gt;Het migratieverhaal is oprecht eenvoudig: update &lt;code&gt;&amp;lt;TargetFramework&amp;gt;&lt;/code&gt;, vernieuw pakketreferenties, verwijder aangepaste fingerprinting-scripts, en u profiteert automatisch van &lt;code&gt;WasmStripILAfterAOT&lt;/code&gt;. Als u AOT compileert, verwacht dan vergelijkbare prestatiewinsten.&lt;/p&gt;
&lt;p&gt;Een opmerking uit de post: als u de .NET WASM-runtime laadt binnen een &lt;code&gt;WebWorker&lt;/code&gt;, stel dan &lt;code&gt;dotnetSidecar = true&lt;/code&gt; in bij het initialiseren.&lt;/p&gt;
&lt;p&gt;Originele post: &lt;a href="https://devblogs.microsoft.com/dotnet/copilot-studio-dotnet-10-migration/"&gt;Copilot Studio gets faster with .NET 10 on WebAssembly&lt;/a&gt;&lt;/p&gt;</content:encoded></item></channel></rss>