当前位置: 欣欣网 > 码农

.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函数分发了异常处理函数,进行调用。

结尾

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

往期精彩回顾