當前位置: 妍妍網 > 碼農

.NET9異常

2024-05-07碼農

點選上方 藍字 江湖評談 設為關註/星標




前言

.NET9為了提速,把異常模型給重寫了。官方的異常測試數值中,這種模型處理提高了2到4倍的效能。新的實作基於AOT的例外處理模型架構。它總共實作在了兩個平台(Win/Linux)四種指令集(/x64/winarm64/arm/arm64上面。

AOT異常模型

整體的來說,之前的異常模型基於C++的非托管處理手段。但是新的異常模型,基於的是自舉的C#托管處理手段。兩者不同在於之前是 ProcessCLRException作為處理異常模組的CLR函式,新的則是托管函式RhThrowEx 作為處理異常模組的 CLR函式。 實際上這一篇講的是舊的異常模型處理(.NET9 PreView3之前異常的處理情況):

新的處理:

#if NATIVEAOT [RuntimeExport("RhThrowEx")]#endifpublicstaticvoidRhThrowEx(object exceptionObj, ref ExInfo exInfo) {#if NATIVEAOT// trigger a GC (only if gcstress) to ensure we can stackwalk at this point GCStress.TriggerGC(); InternalCalls.RhpValidateExInfoStack();#endif// Transform attempted throws of null to a throw of NullReferenceException.if (exceptionObj == null) { IntPtr faultingCodeAddress = exInfo._pExContext->IP; exceptionObj = Get classlibException(ExceptionIDs.NullReference, faultingCodeAddress); } exInfo.Init(exceptionObj); DispatchEx(ref exInfo._frameIter, ref exInfo); FallbackFailFast(RhFailFastReason.InternalError, null); }

上面很明顯的看到它是一個AOT與JIT的混合體 。DispatchEx函式分發了例外處理函式,進行呼叫。

結尾

效能最佳化無處不在,底層基礎決定上層建築。底層不牢,地動山搖。

往期精彩回顧