<?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/ca/tags/performance/</link><description>Articles, tutorials and insights from the .NET community.</description><generator>Hugo</generator><language>ca</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/ca/tags/performance/index.xml" rel="self" type="application/rss+xml"/><item><title>.NET 11 finalment arregla l'API de Processos</title><link>https://thedotnetblog.com/ca/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/ca/news/emiliano-montesdeoca/dotnet-11-process-api-improvements-runandcapturetext/</guid><description>System.Diagnostics.Process rep la seva actualització més gran en anys. RunAndCaptureTextAsync, KillOnParentExit, APIs SafeProcessHandle i control total sobre la redirecció dels identificadors estàndard — sense més codi repetitiu per als bloqueigs morts.</description><content:encoded>&lt;p&gt;Tot desenvolupador .NET que alguna vegada ha hagut de llançar un procés i capturar la seva sortida ha escrit alguna variació del mateix codi repetitiu perillós: lectura async de stdout, lectura async de stderr, &lt;code&gt;WaitForExitAsync&lt;/code&gt;, sense oblidar buidar tots dos streams o causaràs un bloqueig mort. És una trampa ben coneguda que existeix des de fa anys.&lt;/p&gt;
&lt;p&gt;.NET 11 finalment ho arregla correctament.&lt;/p&gt;
&lt;h2 id="runandcapturetextasync"&gt;RunAndCaptureTextAsync&lt;/h2&gt;
&lt;p&gt;L&amp;rsquo;addició principal: un únic mètode estàtic que inicia un procés, captura stdout i stderr, i espera la sortida sense bloqueig mort.&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;Una sola crida. Sense buidatge manual de streams. Sense un &lt;code&gt;WaitForExit&lt;/code&gt; col·locat acuradament. Si simplement necessiteu executar alguna cosa i obtenir la seva sortida, aquesta és l&amp;rsquo;API que voleu.&lt;/p&gt;
&lt;p&gt;Hi ha també &lt;code&gt;Process.RunAsync&lt;/code&gt; per al cas en què voleu esperar la sortida sense capturar el resultat.&lt;/p&gt;
&lt;h2 id="killonparentexit"&gt;KillOnParentExit&lt;/h2&gt;
&lt;p&gt;Un problema comú amb els processos llançats: si el pare falla o és acabat, els processos fill continuen executant-se com a orfes. &lt;code&gt;KillOnParentExit&lt;/code&gt; us permet declarar en el moment d&amp;rsquo;iniciar el procés que el procés fill ha d&amp;rsquo;acabar quan el procés pare surti.&lt;/p&gt;
&lt;p&gt;Aquesta és una funcionalitat que existia de maneres específiques per plataforma (job objects a Windows, prctl a Linux) però requeria p/invoke o biblioteques de tercers per ser usada des de .NET. Ara és una propietat de primera classe a &lt;code&gt;ProcessStartInfo&lt;/code&gt;.&lt;/p&gt;
&lt;h2 id="apis-basades-en-safeprocesshandle"&gt;APIs Basades en SafeProcessHandle&lt;/h2&gt;
&lt;p&gt;La nova superfície d&amp;rsquo;API lleugera es construeix al voltant de &lt;code&gt;SafeProcessHandle&lt;/code&gt; en lloc de la classe &lt;code&gt;Process&lt;/code&gt; completa. La classe &lt;code&gt;Process&lt;/code&gt; completa porta molt d&amp;rsquo;estat i és difícil de retallar — el camí &lt;code&gt;SafeProcessHandle&lt;/code&gt; és més amigable amb el trimmer per a aplicacions que necessiten minimitzar la mida de sortida (WASM, AOT natiu).&lt;/p&gt;
&lt;h2 id="control-total-sobre-lherència-didentificadors"&gt;Control Total Sobre l&amp;rsquo;Herència d&amp;rsquo;Identificadors&lt;/h2&gt;
&lt;p&gt;L&amp;rsquo;actualització també afegeix control detallat sobre quins identificadors hereda un procés fill i com es redireccionen els identificadors estàndard. Anteriorment podíeu redirigir stdin/stdout/stderr però no podíeu especificar exactament quins identificadors heretar a nivell de SO. Les noves APIs exposen aquest control.&lt;/p&gt;
&lt;h2 id="per-què-és-important"&gt;Per Què És Important&lt;/h2&gt;
&lt;p&gt;La classe &lt;code&gt;Process&lt;/code&gt; s&amp;rsquo;usa en eines, sistemes de compilació, executors de proves i qualsevol aplicació que invoca altres executables. L&amp;rsquo;antiga superfície d&amp;rsquo;API datava de .NET Framework i estava mostrant la seva edat. No és un canvi que trenca la compatibilitat — les APIs antigues segueixen funcionant — però el nou codi hauria de preferir la nova superfície.&lt;/p&gt;
&lt;p&gt;Per a aplicacions retallades o escenaris de compilació AOT, el camí &lt;code&gt;SafeProcessHandle&lt;/code&gt; és especialment benvingut. L&amp;rsquo;antiga classe &lt;code&gt;Process&lt;/code&gt; portava molt codi pesat en reflexió que complicava el retallat.&lt;/p&gt;
&lt;p&gt;Publicació original: &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>Com Copilot Studio Va Migrar a .NET 10 WebAssembly i Va Ser un 20% Més Ràpid</title><link>https://thedotnetblog.com/ca/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/ca/news/emiliano-montesdeoca/copilot-studio-net10-webassembly-migration-performance/</guid><description>Les millores de .NET 10 WASM no són només per a projectes nous. Aquí teniu el que Copilot Studio va mesurar després d'actualitzar des de .NET 8: empremtes automàtiques, WasmStripILAfterAOT per defecte i números reals de rendiment d'execució.</description><content:encoded>&lt;p&gt;L&amp;rsquo;equip de Copilot Studio va fer alguna cosa sobre la qual tots els desenvolupadors Blazor WASM han tingut curiositat: van actualitzar una aplicació de producció de .NET 8 a .NET 10 i van mesurar els resultats. La publicació comparteix números específics, cosa que és rara i genuïnament útil.&lt;/p&gt;
&lt;h2 id="lactualització-va-ser-avorrida-això-és-positiu"&gt;L&amp;rsquo;Actualització Va Ser Avorrida (Això és Positiu)&lt;/h2&gt;
&lt;p&gt;Actualitzar el framework de destinació, actualitzar les referències de paquets, corregir els canvis trencadors. Això és tot. La compilació de .NET 10 ara s&amp;rsquo;executa en producció. La migració en si no va ser la part interessant — els canvis de .NET 10 sí que ho són.&lt;/p&gt;
&lt;h2 id="empremta-digital-automàtica-dactius"&gt;Empremta Digital Automàtica d&amp;rsquo;Actius&lt;/h2&gt;
&lt;p&gt;Anteriorment, distribuir una aplicació WASM significava escriure scripts personalitzats per reanomenar els actius publicats amb hashes SHA256 per a la invalidació de caché. Copilot Studio tenia un script PowerShell fent exactament això — reanomenar fitxers, injectar atributs &lt;code&gt;integrity&lt;/code&gt; al carregador JavaScript, gestionar tot manualment.&lt;/p&gt;
&lt;p&gt;A .NET 10, tot això és integrat. Els actius publicats s&amp;rsquo;empremten automàticament, s&amp;rsquo;importen directament de &lt;code&gt;dotnet.js&lt;/code&gt; i es validen amb integritat sense intervenció manual. L&amp;rsquo;equip va eliminar l&amp;rsquo;script de reanomenament.&lt;/p&gt;
&lt;p&gt;Petit canvi en abast, reducció significativa de la complexitat.&lt;/p&gt;
&lt;h2 id="wasmstripilafteraot-ara-està-activat-per-defecte"&gt;WasmStripILAfterAOT Ara Està Activat per Defecte&lt;/h2&gt;
&lt;p&gt;A .NET 8, eliminar IL de les assemblies compilades AOT era opt-in. A .NET 10 és el valor per defecte. Després de la compilació AOT, el codi de bytes IL original s&amp;rsquo;elimina de la sortida — no es necessita en temps d&amp;rsquo;execució, i mantenir-lo inflava la mida del paquet sense raó.&lt;/p&gt;
&lt;p&gt;Copilot Studio utilitza una optimització específica: distribueix tant un motor JIT (inici ràpid) com un motor AOT (rendiment màxim en estat estable), carregant ambdós en paral·lel i passant de JIT a AOT un cop està llest. També deduplicà els fitxers idèntics entre els dos motors.&lt;/p&gt;
&lt;p&gt;El nou comportament d&amp;rsquo;eliminació de IL significa que les assemblies AOT ja no coincideixen bit per bit amb les seves contraparts JIT, de manera que menys fitxers es dedupliquen:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;.NET 8: 59 fitxers compartits&lt;/li&gt;
&lt;li&gt;.NET 10: 22 fitxers compartits&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;Resultat net: mida del paquet aproximadament un 15% major per al motor AOT. La descàrrega AOT és ~6% més lenta en LAN ràpida, ~17% més lenta en 4G. Però tot passa en segon pla després que l&amp;rsquo;aplicació ja és interactiva.&lt;/p&gt;
&lt;h2 id="els-números-de-rendiment"&gt;Els Números de Rendiment&lt;/h2&gt;
&lt;p&gt;Aquesta és la part que importa:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;~20% més ràpid&lt;/strong&gt; en la primera crida (camí fred)&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;~5% més ràpid&lt;/strong&gt; en crides posteriors (camí calent)&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;Les millores són més visibles en &amp;ldquo;bots grans&amp;rdquo; — agents grans i complexos on el codi compilat AOT domina. Per a fluxos de treball més simples el guany és menor.&lt;/p&gt;
&lt;h2 id="si-encara-esteu-a-net-8"&gt;Si Encara Esteu a .NET 8&lt;/h2&gt;
&lt;p&gt;La història de migració és genuïnament senzilla: actualitzeu &lt;code&gt;&amp;lt;TargetFramework&amp;gt;&lt;/code&gt;, actualitzeu les referències de paquets, elimineu qualsevol script d&amp;rsquo;empremtes personalitzat, i us beneficiareu automàticament de &lt;code&gt;WasmStripILAfterAOT&lt;/code&gt;. Si esteu compilant AOT, espereu guanys de rendiment similars.&lt;/p&gt;
&lt;p&gt;Una nota de la publicació: si carregueu el runtime de .NET WASM dins d&amp;rsquo;un &lt;code&gt;WebWorker&lt;/code&gt;, configureu &lt;code&gt;dotnetSidecar = true&lt;/code&gt; en inicialitzar.&lt;/p&gt;
&lt;p&gt;Post original: &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>