<?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/hi/tags/performance/</link><description>Articles, tutorials and insights from the .NET community.</description><generator>Hugo</generator><language>hi</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/hi/tags/performance/index.xml" rel="self" type="application/rss+xml"/><item><title>.NET 11 ने अंततः प्रोसेस API को ठीक किया</title><link>https://thedotnetblog.com/hi/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/hi/news/emiliano-montesdeoca/dotnet-11-process-api-improvements-runandcapturetext/</guid><description>System.Diagnostics.Process को वर्षों में सबसे बड़ा अपडेट मिलता है। RunAndCaptureTextAsync, KillOnParentExit, SafeProcessHandle API, और स्टैंडर्ड हैंडल रीडायरेक्शन पर पूरा नियंत्रण — डेडलॉक बॉयलरप्लेट कोड की जरूरत नहीं।</description><content:encoded>&lt;p&gt;हर .NET डेवलपर जिसे कभी एक प्रोसेस शुरू करके उसका आउटपुट कैप्चर करना पड़ा है, उसने उसी खतरनाक बॉयलरप्लेट कोड का कोई न कोई वेरिएशन लिखा है: stdout से async रीड, stderr से async रीड, &lt;code&gt;WaitForExitAsync&lt;/code&gt;, दोनों स्ट्रीम को ड्रेन करना न भूलें वरना डेडलॉक हो जाएगा। यह एक जानी-पहचानी समस्या है जो वर्षों से चली आ रही है।&lt;/p&gt;
&lt;p&gt;.NET 11 अंततः इसे सही ढंग से ठीक करता है।&lt;/p&gt;
&lt;h2 id="runandcapturetextasync"&gt;RunAndCaptureTextAsync&lt;/h2&gt;
&lt;p&gt;मुख्य जोड़: एक सिंगल स्टैटिक मेथड जो एक प्रोसेस शुरू करता है, stdout और stderr कैप्चर करता है, और डेडलॉक के बिना एग्जिट का इंतजार करता है।&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;एक कॉल। कोई मैनुअल स्ट्रीम ड्रेनिंग नहीं। कोई सावधानी से रखा गया &lt;code&gt;WaitForExit&lt;/code&gt; नहीं। अगर आपको बस कुछ रन करना है और उसका आउटपुट चाहिए, तो यही वो API है।&lt;/p&gt;
&lt;p&gt;आउटपुट कैप्चर किए बिना एग्जिट का इंतजार करने के लिए &lt;code&gt;Process.RunAsync&lt;/code&gt; भी है।&lt;/p&gt;
&lt;h2 id="killonparentexit"&gt;KillOnParentExit&lt;/h2&gt;
&lt;p&gt;शुरू किए गए प्रोसेस की एक सामान्य समस्या: अगर पैरेंट क्रैश हो जाए या बंद हो जाए, तो चाइल्ड प्रोसेस अनाथ की तरह चलते रहते हैं। &lt;code&gt;KillOnParentExit&lt;/code&gt; आपको प्रोसेस शुरू करते वक्त घोषित करने देता है कि पैरेंट प्रोसेस के बंद होने पर चाइल्ड प्रोसेस भी बंद हो जाए।&lt;/p&gt;
&lt;p&gt;यह एक ऐसी सुविधा थी जो प्लेटफॉर्म-विशिष्ट तरीकों से मौजूद थी (Windows पर job objects, Linux पर prctl) लेकिन .NET से इस्तेमाल करने के लिए p/invoke या थर्ड-पार्टी लाइब्रेरी की जरूरत थी। अब यह &lt;code&gt;ProcessStartInfo&lt;/code&gt; पर एक फर्स्ट-क्लास प्रॉपर्टी है।&lt;/p&gt;
&lt;h2 id="safeprocesshandle-आधरत-api"&gt;SafeProcessHandle-आधारित API&lt;/h2&gt;
&lt;p&gt;नई लाइटवेट API सर्फेस पूर्ण &lt;code&gt;Process&lt;/code&gt; क्लास के बजाय &lt;code&gt;SafeProcessHandle&lt;/code&gt; के आसपास बनाई गई है। पूर्ण &lt;code&gt;Process&lt;/code&gt; क्लास बहुत सारी स्थिति लेकर चलती है और इसे ट्रिम करना मुश्किल है — &lt;code&gt;SafeProcessHandle&lt;/code&gt; पाथ उन एप्लीकेशन के लिए ज़्यादा ट्रिमर-फ्रेंडली है जिन्हें आउटपुट साइज़ कम करनी है (WASM, नेटिव AOT)।&lt;/p&gt;
&lt;h2 id="हडल-इनहरटस-पर-पर-नयतरण"&gt;हैंडल इनहेरिटेंस पर पूरा नियंत्रण&lt;/h2&gt;
&lt;p&gt;अपडेट में यह भी जोड़ा गया है कि एक चाइल्ड प्रोसेस कौन से हैंडल इनहेरिट करता है और स्टैंडर्ड हैंडल कैसे रीडायरेक्ट होते हैं, इस पर बारीक नियंत्रण। पहले आप stdin/stdout/stderr रीडायरेक्ट कर सकते थे, लेकिन OS स्तर पर ठीक-ठीक कौन से हैंडल इनहेरिट करने हैं यह नहीं बता सकते थे। नई APIs वो नियंत्रण देती हैं।&lt;/p&gt;
&lt;h2 id="यह-कय-मयन-रखत-ह"&gt;यह क्यों मायने रखता है&lt;/h2&gt;
&lt;p&gt;&lt;code&gt;Process&lt;/code&gt; क्लास tooling, build सिस्टम, test रनर, और किसी भी एप्लीकेशन में उपयोग होती है जो अन्य executables को कॉल करती है। पुरानी API सर्फेस .NET Framework के ज़माने की थी। यह कोई ब्रेकिंग चेंज नहीं है — पुरानी API काम करती रहती है — लेकिन नए कोड को नई सर्फेस को प्राथमिकता देनी चाहिए।&lt;/p&gt;
&lt;p&gt;ट्रिम्ड एप्लीकेशन या AOT कंपाइलेशन परिदृश्यों के लिए, &lt;code&gt;SafeProcessHandle&lt;/code&gt; पाथ विशेष रूप से स्वागत योग्य है। पुरानी &lt;code&gt;Process&lt;/code&gt; क्लास बहुत सारा reflection-heavy कोड लाती थी जो ट्रिमिंग को जटिल बनाता था।&lt;/p&gt;
&lt;p&gt;मूल पोस्ट: &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>Copilot Studio ने .NET 10 WebAssembly में माइग्रेट करके 20% तेज़ गति कैसे प्राप्त की</title><link>https://thedotnetblog.com/hi/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/hi/news/emiliano-montesdeoca/copilot-studio-net10-webassembly-migration-performance/</guid><description>.NET 10 WASM सुधार केवल नई परियोजनाओं के लिए नहीं हैं। .NET 8 से अपग्रेड करने के बाद Copilot Studio ने जो मापा: स्वचालित फिंगरप्रिंटिंग, डिफ़ॉल्ट WasmStripILAfterAOT, और वास्तविक निष्पादन प्रदर्शन संख्याएं।</description><content:encoded>&lt;p&gt;Copilot Studio टीम ने वह किया जिसके बारे में सभी Blazor WASM डेवलपर उत्सुक थे: उन्होंने वास्तव में एक प्रोडक्शन एप्लिकेशन को .NET 8 से .NET 10 में अपग्रेड किया और परिणाम मापे। पोस्ट में विशिष्ट संख्याएं साझा की गई हैं, जो दुर्लभ और वास्तव में उपयोगी है।&lt;/p&gt;
&lt;h2 id="अपगरड-उबऊ-थ-यह-एक-अचछ-बत-ह"&gt;अपग्रेड उबाऊ था (यह एक अच्छी बात है)&lt;/h2&gt;
&lt;p&gt;टार्गेट फ्रेमवर्क अपडेट करना, पैकेज संदर्भ ताज़ा करना, ब्रेकिंग बदलाव ठीक करना। बस इतना ही। .NET 10 बिल्ड अब प्रोडक्शन में चल रहा है। माइग्रेशन खुद दिलचस्प हिस्सा नहीं था — .NET 10 में बदलाव हैं।&lt;/p&gt;
&lt;h2 id="सवचलत-एसट-फगरपरटग"&gt;स्वचालित एसेट फिंगरप्रिंटिंग&lt;/h2&gt;
&lt;p&gt;पहले, WASM ऐप वितरित करने का मतलब था कैश-बस्टिंग के लिए SHA256 हैश के साथ प्रकाशित एसेट का नाम बदलने के लिए कस्टम स्क्रिप्ट लिखना। Copilot Studio के पास एक PowerShell स्क्रिप्ट थी जो ठीक यही करती थी — फ़ाइलें रीनेम करना, JavaScript लोडर में &lt;code&gt;integrity&lt;/code&gt; विशेषताएं इंजेक्ट करना, सब कुछ मैन्युअल रूप से प्रबंधित करना।&lt;/p&gt;
&lt;p&gt;.NET 10 में, यह सब अंतर्निहित है। प्रकाशित एसेट स्वचालित रूप से फिंगरप्रिंट किए जाते हैं, सीधे &lt;code&gt;dotnet.js&lt;/code&gt; से आयात किए जाते हैं, और मैन्युअल हस्तक्षेप के बिना अखंडता-सत्यापित होते हैं। टीम ने रीनेमिंग स्क्रिप्ट हटा दी।&lt;/p&gt;
&lt;p&gt;दायरे में छोटा बदलाव, जटिलता में महत्वपूर्ण कमी।&lt;/p&gt;
&lt;h2 id="wasmstripilafteraot-अब-डफलट-रप-स-चल"&gt;WasmStripILAfterAOT अब डिफ़ॉल्ट रूप से चालू&lt;/h2&gt;
&lt;p&gt;.NET 8 में, AOT-कंपाइल असेंबली से IL हटाना ऑप्ट-इन था। .NET 10 में यह डिफ़ॉल्ट है। AOT संकलन के बाद, मूल IL बाइटकोड आउटपुट से हटा दिया जाता है — रनटाइम पर इसकी आवश्यकता नहीं होती, और इसे रखने से पैकेज साइज़ बिना कारण बढ़ता था।&lt;/p&gt;
&lt;p&gt;Copilot Studio एक विशिष्ट अनुकूलन का उपयोग करता है: यह JIT इंजन (तेज़ स्टार्टअप) और AOT इंजन (अधिकतम स्टेडी-स्टेट प्रदर्शन) दोनों वितरित करता है, दोनों को समानांतर में लोड करता है और तैयार होने पर JIT से AOT में हैंडऑफ़ करता है। यह दोनों इंजनों के बीच समान फ़ाइलों को भी डीडुप्लीकेट करता है।&lt;/p&gt;
&lt;p&gt;नया IL स्ट्रिपिंग व्यवहार इसका मतलब है कि AOT असेंबली अब अपने JIT समकक्षों के साथ बिट-फॉर-बिट मेल नहीं खाती, इसलिए कम फ़ाइलें डीडुप्लीकेट होती हैं:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;.NET 8: 59 साझा फ़ाइलें&lt;/li&gt;
&lt;li&gt;.NET 10: 22 साझा फ़ाइलें&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;शुद्ध परिणाम: AOT इंजन के लिए पैकेज साइज़ लगभग 15% बड़ा। AOT डाउनलोड तेज़ LAN पर ~6% धीमा, 4G पर ~17% धीमा। लेकिन यह सब ऐप के इंटरैक्टिव हो जाने के बाद पृष्ठभूमि में होता है।&lt;/p&gt;
&lt;h2 id="परदरशन-सखयए"&gt;प्रदर्शन संख्याएं&lt;/h2&gt;
&lt;p&gt;यह वह हिस्सा है जो मायने रखता है:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;पहली कॉल पर &lt;strong&gt;~20% तेज़&lt;/strong&gt; (कोल्ड पाथ)&lt;/li&gt;
&lt;li&gt;बाद की कॉल पर &lt;strong&gt;~5% तेज़&lt;/strong&gt; (वार्म पाथ)&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;&amp;ldquo;बड़े बॉट्स&amp;rdquo; में सुधार सबसे अधिक दिखाई देते हैं — बड़े, जटिल एजेंट जहां AOT-कंपाइल कोड हावी है। सरल वर्कफ़्लो के लिए लाभ छोटा है।&lt;/p&gt;
&lt;h2 id="यद-आप-अभ-भ-net-8-पर-ह"&gt;यदि आप अभी भी .NET 8 पर हैं&lt;/h2&gt;
&lt;p&gt;माइग्रेशन की कहानी वास्तव में सरल है: &lt;code&gt;&amp;lt;TargetFramework&amp;gt;&lt;/code&gt; अपडेट करें, पैकेज संदर्भ अपडेट करें, कोई भी कस्टम फिंगरप्रिंटिंग स्क्रिप्ट हटाएं, और आप स्वचालित रूप से &lt;code&gt;WasmStripILAfterAOT&lt;/code&gt; से लाभ उठाएंगे। यदि आप AOT कंपाइल कर रहे हैं, तो समान प्रदर्शन लाभ की उम्मीद करें।&lt;/p&gt;
&lt;p&gt;पोस्ट से एक नोट: यदि आप &lt;code&gt;WebWorker&lt;/code&gt; के अंदर .NET WASM रनटाइम लोड करते हैं, तो इनिशियलाइज़ करते समय &lt;code&gt;dotnetSidecar = true&lt;/code&gt; सेट करें।&lt;/p&gt;
&lt;p&gt;मूल पोस्ट: &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>