点击上方 蓝字 江湖评谈 设为关注/星标
前言
.NET9为了提速,把异常模型给重写了。官方的异常测试数值中,这种模型处理提高了2到4倍的性能。新的实现基于AOT的异常处理模型架构。它总共实现在了两个平台(Win/Linux)四种指令集(/x64/winarm64/arm/arm64上面。
AOT异常模型
整体的来说,之前的异常模型基于C++的非托管处理手段。但是新的异常模型,基于的是自举的C#托管处理手段。两者不同在于之前是 ProcessCLRException作为处理异常模块的CLR函数,新的则是托管函数RhThrowEx 作为处理异常模块的 CLR函数。 实际上这一篇讲的是旧的异常模型处理(.NET9 PreView3之前异常的处理情况):
新的处理:
#if NATIVEAOT
[RuntimeExport("RhThrowEx")]
#endif
publicstaticvoidRhThrowEx(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函数分发了异常处理函数,进行调用。
结尾
性能优化无处不在,底层基础决定上层建筑。底层不牢,地动山摇。
往期精彩回顾