یک کیت توسعه C# سریعتر و سبکتر
کیت توسعه C# بازسازی شده است تا راهحلها را در حدود یک ثانیه باز کند و با کسری از حافظه قبلی اجرا شود، و این مقاله به بررسی تغییرات ایجاد شده برای شما میپردازد.
ما برنامهنویسان میدانیم که رایانهها چقدر میتوانند سریع باشند و میخواهیم این سرعت را در ابزارهای خود نیز حس کنیم. انتظار برای بارگذاری پشتیبانی زبان، اتمام ساخت (Build) و اجرای تستها، زمانی است که میتوانستیم به شکلهای بهتری صرف کنیم.
به عنوان بخشی از داتنت ۱۱ (NET 11)، کیت توسعه C# به طور کامل بازطراحی شده است تا بهبودهای چشمگیری در عملکرد و مصرف حافظه ارائه دهد. همچنین دارای قابلیتهای جدید و فوقالعادهای است.
این اولین مقاله از یک سری پستهای وبلاگی است که بهبودهای موجود در C# Dev Kit 11.0 را پوشش میدهد. در این مقاله، ما بهبودها را به صورت کلی بررسی میکنیم و در پستهای آینده برای کسانی که علاقه دارند، به جزئیات خواهیم پرداخت.
ما نسخه کیت توسعه C# را با نسخه فعلی داتنت هماهنگ میکنیم. نسخه جدید افزونه ۱۱.۰ است و نسخه قبلی ۳.۳ بود.
بیایید ببینیم چه چیزهای جدیدی ارائه شده است.
بارگذاریهای سریعتر
ما زمانهای بارگذاری را روی دو پروژه واقعی اندازهگیری کردیم: Orleans (با ۱۵۵ پروژه) و Aspire (با ۴۰۷ پروژه).
| راهحل (Solution) | پروژهها | وضعیت آمادهسازی | کیت توسعه C# نسخه 3.3 | کیت توسعه C# نسخه 11.0 | سریعتر با 🎉 |
|---|---|---|---|---|---|
| dotnet/orleans | 155 | فایل فعال | تا ۵۰.۳ ثانیه | 0.53 s | تا ۹۵ برابر |
| کل راهحل (Solution) | 50.3 s | 2.3 s | 22× | ||
| dotnet/aspire | 407 | فایل فعال | تا ۸۴.۱ ثانیه | 0.47 s | تا ۱۸۰ برابر |
| کل راهحل (Solution) | 84.1 s | 3.0 s | 28× |
این جدول دو لحظه را در طول بارگذاری نشان میدهد. «آمادهسازی فایل فعال» زمانی است که پشتیبانی از زبان در فایلی که در حال ویرایش آن هستید، به همراه قابلیتهای تکمیل کد (Completions)، عیبیابی (Diagnostics)، رفتن به تعریف (Go to definition) و اصلاحات سریع در دسترس قرار میگیرد. این نقطهای است که میتوانید کار واقعی را انجام دهید. «آمادهسازی کل راهحل» زمانی است که بارگذاری تمامی پروژهها به پایان رسیده است، بنابراین پشتیبانی زبان در هر فایلی کار میکند، تستهای سراسر راهحل شناسایی میشوند و قابلیت «پیدا کردن همه ارجاعات» در تمام پروژهها کار میکند.
کشهای پروژه جدید در کیت توسعه C# به این بارگذاری سریعتر کمک میکنند. این کیت دیگر در هر بار باز شدن، درک خود از هر پروژه را از نو نمیسازد، بنابراین سرویسهای زبانی، تستها و اهداف راهاندازی تقریباً بلافاصله در دسترس قرار میگیرند. اکنون این کیت ابتدا فایل فعال را بارگذاری میکند، بنابراین میتوانید در حالی که بقیه فضای کاری در پسزمینه بارگذاری میشود، کار خود را در آنجا آغاز کنید؛ و این کار با عملکردی ثابت و صرفنظر از تعداد پروژهها انجام میشود. پیادهسازی قبلی، پروژهها را به ترتیب ثابتی بارگذاری میکرد، بنابراین زمان بارگذاری به این بستگی داشت که فایل در آن ترتیب در چه موقعیتی قرار گیرد.
کش یک پروژه برای اولین بار که آن پروژه بارگذاری میشود، ساخته میشود. هر بارگذاری پس از آن از طریق کش سرویسدهی میشود و بسیار سریع است. اگر فایلهای کش خود را به سیستم کنترل نسخه (Version Control) ارسال کنید، کلونهای تازه و ورکتریهای (Worktree) جدید گیت بلافاصله از پشتیبانی ابزاری سریع برخوردار خواهند شد که هنگام کار با عاملها (Agents) بسیار عالی است.
ما همچنین با ادغام چندین فرآیند در یک فرآیند واحد، زمان بارگذاری را کوتاهتر کردیم. نسخه قبلی شش فرآیند مدیریتشده را راهاندازی میکرد که هر کدام باید بررسیهای آنتیویروس را پشت سر میگذاشتند، تصاویر را از دیسک بارگذاری میکردند، کامپایل JIT را انجام میدادند (که از طریق ReadyToRun به حداقل رسیده بود) و سپس به یکدیگر متصل میشدند. تمام این مراحل باید پیش از پاسخگویی به حتی یک سوال درباره کد شما انجام میشد.
این فرآیند یکپارچهشده CSDevKit یک فایل اجرایی بومی است که با استفاده از قابلیت Native AOT داتنت، پیش از موعد (AOT) کامپایل شده است. این فرآیند بلافاصله و بدون نیاز به بارگذاری زمان اجرا (Runtime) و بدون کامپایل در لحظه (JIT) در مسیر راهاندازی، شروع به اجرا میکند.
دادههای کششده، فرآیند کمتر و Native AOT به معنای یک تجربه توسعه با پاسخگویی بسیار بالاتر هستند. مقالات آینده در این مجموعه این موضوعات را با جزئیات بیشتری بررسی خواهند کرد.
ساختهای (Builds) سریعتر
کیت توسعه C# نسخه 11.0 به لطف بررسیهای سریع بهروز بودن (Fast up-to-date checks) و شتابدهی ساخت (Build Acceleration) -دو قابلیتی که توسعهدهندگان ویژوال استودیو مدتی است از آنها بهرهمند هستند- ساختهای تدریجی بسیار سریعتری دارد.
ما بار دیگر از راهحل Aspire با ۴۰۷ پروژه استفاده خواهیم کرد و در هر بار، کل راهحل را ساخت (Build) میکنیم.
| تغییرات در ساخت (Build) | کیت توسعه C# نسخه 3.3 | کیت توسعه C# نسخه 11.0 | سریعتر با 🎉 |
|---|---|---|---|
| هیچکدام | 34.4 s | 0.88 s | 39× |
| فایل تکی C# | 36.1 s | 2.1 s | 17× |
در نسخه ۱۱.۰، سربار مربوط به تشخیص تغییرات و کپی کردن فایلهای خروجی را به شدت کاهش دادهایم.
زمانهای ساخت (Build) به ساختار سلوشن بستگی دارد، بنابراین همه ساختها شاهد چنین افزایش سرعت چشمگیری نخواهند بود. با این حال، معمولاً در هر بار تغییرات کمی اعمال میشود و این همان سناریویی است که بیشترین بهبود را در نسخه ۱۱.۰ تجربه میکند.
افزایش سرعت پاسخگویی هنگام اجرای تستهای واحد (Unit Tests) و راهاندازی برنامهها کاملاً مشهود است. هر دو عملیات پیش از شروع، یک فرآیند ساخت را انجام میدهند، بنابراین در نسخه ۱۱.۰ زودتر به پایان میرسند.
حافظه
معماری قبلی، سرویسهای داخلی کیت توسعه C# (C# Dev Kit) را در شش فرآیند به هم پیوسته پخش کرده بود. این نسخه تمامی آن فرآیندها را در یک سرور واحد که با Native AOT کامپایل شده است، ادغام میکند.
| سلوشن (Solution) | پروژهها | فایلهای C# | کیت توسعه C# ۳.۳ | کیت توسعه C# ۱۱.۰ | کاهش حجم 🎉 |
|---|---|---|---|---|---|
| dotnet/orleans | 155 | 4,010 | ۱,۳۰۷ مگابایت | ۲۰۸ مگابایت | ~84% |
| dotnet/roslyn | 398 | 18,153 | ۲,۰۰۰ مگابایت | ۳۷۹ مگابایت | ~81% |
| dotnet/aspire | 407 | 4,686 | ۲,۰۷۲ مگابایت | ۳۱۶ مگابایت | ~85% |
مصرف حافظه بیش از آنکه به تعداد پروژهها وابسته باشد، با اندازه پایگاه کد (Codebase) همبستگی دارد. Roslyn حدود چهار برابر Aspire کد C# دارد، بنابراین سرور آن حتی با تعداد پروژههای کمتر، حافظه بیشتری مصرف میکند؛ در حالی که مدل پروژه فشرده باعث میشود رشد حافظه بسیار کندتر از خود کد باشد.
این ارقام نشاندهنده حافظه تخصیصیافته توسط فرآیند(های) سرور کیت توسعه C# است. سرویس زبان C# (Roslyn) طبق روال قبل در فرآیند اختصاصی خود اجرا میشود و Visual Studio Code نیز ردپای حافظه خود را دارد. هیچکدام در این مقایسه نمایش داده نشدهاند؛ هر دو در این نسخه تا حد زیادی بدون تغییر باقی ماندهاند.
نسخه ۱۱.۰ دارای یک بازنمایی فشردهتر از پروژه در حافظه (In-memory) است که مصرف حافظه را به طور قابل توجهی کاهش میدهد، به ویژه برای سلوشنهای بزرگ. فناوری Native AOT نیز حافظه کمتری در زمان اجرا مصرف میکند.
ویرایش پروژهها و سایر فایلهای MSBuild
کیت توسعه C# ۱۱.۰ شامل یک تجربه ویرایش جدید برای فایلهای .csproj، .props و .targets است. شما از قابلیتهایی مانند تکمیل خودکار (Completions)، عیبیابی (Diagnostics)، رفتن به تعریف (Go to definition)، اصلاحات سریع (Quick fixes) و برجستهسازی معنایی (Semantic highlighting) بهرهمند میشوید: همان سطح از پشتیبانی زبانی که هنگام ویرایش کدهای C# انتظار دارید.
اکنون تکمیل خودکار برای نامها و نسخههای بستهها ارائه میشود:
https://devblogs.microsoft.com/dotnet/wp-content/uploads/sites/10/2026/10/package-completion.mp4
همچنین بستهها دارای یک بخش CodeLens هستند که اقدامات مفیدی را ارائه میدهد. این بخش زمانی که نسخههای جدیدتر در دسترس باشند یا نسخه در حال استفاده دارا آسیبپذیری باشد، به شما هشدار میدهد.
پشتیبانی زبانی MSBuild به بستهها محدود نمیشود. تکمیل خودکار شامل ویژگیها (Properties)، آیتمها (Items) و کلیدهای متادیتا نیز میشود. قابلیت «رفتن به تعریف» روی چندین عنصر زبانی کار میکند و میتواند شما را به سورس SDK هدایت کند. بخش عیبیابی مشکلات را همزمان با تایپ کردن علامتگذاری میکند و اصلاحات سریعی را پیشنهاد میدهد.
بررسی سلامت با ابزار C# Doctor
یکی دیگر از امکانات جدید کیت توسعه C#، ابزار C# Doctor است.
هنگامی که یک پروژه بارگذاری نمیشود یا به شکلی که انتظار دارید رفتار نمیکند، علت اغلب محیطی است. یک SDK مورد نیاز گم شده است، یک زمان اجرا (Runtime) نصب نشده است، فریمورک مقصد در دسترس نیست، بازیابی بسته (Package restore) با شکست مواجه شده، یا بسته ارجاعشده دارای یک آسیبپذیری شناختهشده است. ابزار C# Doctor تمام این بررسیها را در یک جا جمعآوری کرده و شما را به سمت یک راهحل مناسب هدایت میکند، به جای اینکه شما را تنها بگذارد تا دلیل مشکل را از پیامهای خطای پراکنده حدس بزنید. این ابزار دستیابی به ابزار دقیق و پیکربندی مورد نیاز برای کارکرد پروژههایتان با کیت توسعه C# را بسیار سادهتر میکند.
قدم بعدی چیست؟
نقش محیطهای توسعه یکپارچه (IDE) در حال تغییر است. همانطور که توسعهدهندگان جریانهای کاری جدید را میپذیرند، ما همچنان نقاط ضعف ابزارهایمان را شناسایی میکنیم. هنگام توسعه با ایجنتها (Agents)، باید بسیار سریعتر وارد ابزارها شده و از آنها خارج شویم و بتوانیم چندین نمونه (Instance) را به صورت موازی اجرا کنیم. تغییرات معماری که در کیت توسعه C# ۱۱.۰ ایجاد کردهایم، این افزونه را برای سالهای آینده آماده میکند.
این موارد، بهبودهایی در جنبههای اساسی ابزارسازی هستند که هم برای توسعهدهندگان انسانی و هم برای ایجنتهایی که در انتظارشان هستند، مفید خواهند بود.
ما در حال سرمایهگذاریهای بلندمدت روی این مؤلفهها هستیم تا آنها را در محیطهای بیشتری در دسترس قرار دهیم و سازگاری و کارایی بیشتری را در سراسر اکوسیستم ایجاد کنیم. منتظر بهروزرسانیهای بیشتری در این زمینه باشید.
پستهای وبلاگ بعدی در این سری به بررسی عمیقتر معماری سادهتر، سرور Native AOT، بارگذاری کششده پروژه و ساختهای سریعتر خواهند پرداخت.
آن را امتحان کنید
کیت توسعه C# ۱۱.۰ هماکنون به صورت پیشانتشار (Pre-release) در دسترس است، بنابراین سریعترین راه برای دیدن تفاوت این است که آن را بهروزرسانی کرده و یکی از سلوشنهای خود را باز کنید. امیدواریم استفاده از آن را سریعتر و آسانتر بیابید.
پس از نصب، در نمای Extensions (افزونهها) روی صفحه C# Dev Kit گزینه Switch to Pre-Release Version را انتخاب کنید تا در کانال پیشانتشار (pre-release) عضو شده و این بهبودها را مشاهده کنید.
ما به سختی تلاش میکنیم تا آن را برای انتشار در کانال پایدار آماده کنیم، و بازخوردهای شما به شکلدهی این روند کمک خواهد کرد. میتوانید باگها و پیشنهادات خود را در GitHub ثبت کنید.
نظر مهندس بهمن آبادی: انتقال منطق پردازشی به Native AOT و استفاده از کشهای ساختاریافته در C# Dev Kit 11، فراتر از یک بهینهسازی ساده است؛ این تغییر معماری، گلوگاههای سنتی VS Code را در پروژههای بزرگ کاملاً از بین میبرد. این سرعتِ لحظهای، نه تنها تجربه توسعهدهنده را متحول میکند، بلکه پیشنیاز حیاتی و هوشمندانهای برای تعامل بیدرنگ و موازی با ایجنِتهای هوش مصنوعی است.
منبع: https://devblogs.microsoft.com/dotnet/faster-lighter-csharp-dev-kit/