點選上方 藍字 江湖評談 設為關註/星標
前言
.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函式分發了例外處理函式,進行呼叫。
結尾
效能最佳化無處不在,底層基礎決定上層建築。底層不牢,地動山搖。
往期精彩回顧