قام فريق Copilot Studio بشيء كان فضوليًا بشأنه جميع مطوري Blazor WASM: لقد قاموا فعليًا بترقية تطبيق إنتاجي من .NET 8 إلى .NET 10 وقاسوا النتائج. يشارك المنشور أرقامًا محددة، وهو أمر نادر ومفيد حقًا.
الترقية كانت مملة (هذا أمر جيد)
تحديث إطار العمل المستهدف، تحديث مراجع الحزم، إصلاح التغييرات المخلة. هذا كل شيء. بناء .NET 10 يعمل الآن في الإنتاج. الهجرة نفسها لم تكن الجزء المثير للاهتمام — التغييرات في .NET 10 هي ذلك.
البصمة التلقائية للأصول
في السابق، كان توزيع تطبيق WASM يعني كتابة نصوص برمجية مخصصة لإعادة تسمية الأصول المنشورة بتجزئات SHA256 لتجاوز التخزين المؤقت. كان لدى Copilot Studio نص PowerShell يقوم بهذا بالضبط — إعادة تسمية الملفات، حقن سمات integrity في محمّل JavaScript، إدارة كل شيء يدويًا.
في .NET 10، كل ذلك مدمج. يتم وضع بصمة تلقائية على الأصول المنشورة، واستيرادها مباشرة من dotnet.js، والتحقق من سلامتها دون تدخل يدوي. قام الفريق بحذف نص إعادة التسمية.
تغيير صغير في النطاق، تخفيض كبير في التعقيد.
WasmStripILAfterAOT مفعّل الآن افتراضيًا
في .NET 8، كان إزالة IL من التجميعات المترجمة بـ AOT اختياريًا. في .NET 10 هو السلوك الافتراضي. بعد ترجمة AOT، يتم إزالة رمز IL الأصلي من المخرجات — غير مطلوب في وقت التشغيل، والاحتفاظ به كان يضخم حجم الحزمة دون سبب.
يستخدم Copilot Studio تحسينًا محددًا: يوزع كلًا من محرك JIT (بدء سريع) ومحرك AOT (أقصى أداء في الحالة الثابتة)، يحمّل كليهما بالتوازي وينتقل من JIT إلى AOT بمجرد استعداده. كما يُزيل تكرار الملفات المتطابقة بين المحركَين.
يعني سلوك إزالة IL الجديد أن تجميعات AOT لم تعد تطابق نظيراتها من JIT بشكل بت ببت، لذا تُزال تكرارات ملفات أقل:
- .NET 8: 59 ملفًا مشتركًا
- .NET 10: 22 ملفًا مشتركًا
النتيجة الصافية: حجم حزمة أكبر بحوالي 15% لمحرك AOT. تنزيل AOT أبطأ بحوالي 6% على شبكة LAN السريعة، وأبطأ بحوالي 17% على 4G. لكن كل ذلك يحدث في الخلفية بعد أن يصبح التطبيق تفاعليًا بالفعل.
أرقام الأداء
هذا هو الجزء المهم:
- أسرع بحوالي 20% في المكالمة الأولى (المسار البارد)
- أسرع بحوالي 5% في المكالمات اللاحقة (المسار الدافئ)
التحسينات أكثر وضوحًا في “البوتات الكبيرة” — العملاء الكبيرة والمعقدة حيث يهيمن الكود المترجم بـ AOT. لسير العمل الأبسط، الكسب أصغر.
إذا كنت لا تزال على .NET 8
قصة الهجرة بسيطة بحق: حدّث <TargetFramework>، حدّث مراجع الحزم، احذف أي نصوص بصمة مخصصة، وستستفيد تلقائيًا من WasmStripILAfterAOT. إذا كنت تترجم بـ AOT، توقع مكاسب مماثلة في الأداء.
ملاحظة من المنشور: إذا كنت تحمّل وقت تشغيل .NET WASM داخل WebWorker، اضبط dotnetSidecar = true عند التهيئة.
المنشور الأصلي: Copilot Studio gets faster with .NET 10 on WebAssembly
