.NET9异常

文摘   科技   2024-05-06 08:29   湖北  

点击上方蓝字 江湖评谈设为关注/星标




前言

.NET9为了提速,把异常模型给重写了。官方的异常测试数值中,这种模型处理提高了2到4倍的性能。新的实现基于AOT的异常处理模型架构。它总共实现在了两个平台(Win/Linux)四种指令集(/x64/winarm64/arm/arm64上面。

AOT异常模型

整体的来说,之前的异常模型基于C++的非托管处理手段。但是新的异常模型,基于的是自举的C#托管处理手段。两者不同在于之前是ProcessCLRException作为处理异常模块的CLR函数,新的则是托管函数RhThrowEx作为处理异常模块的CLR函数。实际上这一篇讲的是旧的异常模型处理(.NET9 PreView3之前异常的处理情况):.NET9异常(CLR)原理(顶阶技术

新的处理:

#if NATIVEAOT        [RuntimeExport("RhThrowEx")]#endif        public static void RhThrowEx(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 = GetClasslibException(ExceptionIDs.NullReference, faultingCodeAddress); }
exInfo.Init(exceptionObj); DispatchEx(ref exInfo._frameIter, ref exInfo); FallbackFailFast(RhFailFastReason.InternalError, null); }

上面很明显的看到它是一个AOT与JIT的混合体。DispatchEx函数分发了异常处理函数,进行调用。

结尾

性能优化无处不在,底层基础决定上层建筑。底层不牢,地动山摇。

往期精彩回顾

.NET9 Pre3 CLR的优化细节

.NET9 GC标记原理(超核技术)


江湖评谈
记录,分享,自由。
 最新文章