48 lines
1.5 KiB
C#
48 lines
1.5 KiB
C#
// Copyright (c) 2023 bradson
|
|
// This Source Code Form is subject to the terms of the Mozilla Public
|
|
// License, v. 2.0. If a copy of the MPL was not distributed with this
|
|
// file, You can obtain one at https://mozilla.org/MPL/2.0/.
|
|
|
|
using System.Linq;
|
|
|
|
namespace PerformanceFish;
|
|
|
|
public sealed class AccessToolsCaching : ClassWithFishPatches
|
|
{
|
|
public sealed class AllTypes : FishPatch
|
|
{
|
|
public override string? Description { get; } = "Caches AccessTools.AllTypes to only recalculate when the "
|
|
+ "loaded assembly count changes. Improves load times.";
|
|
|
|
public override Delegate? TargetMethodGroup { get; } = AccessTools.AllTypes;
|
|
|
|
[MethodImpl(MethodImplOptions.AggressiveInlining)]
|
|
public static bool Prefix(ref IEnumerable<Type> __result, out bool __state)
|
|
{
|
|
var currentAssemblyCount = AppDomain.CurrentDomain.GetAssemblies().Length;
|
|
if (currentAssemblyCount != _cachedAssemblyCount)
|
|
{
|
|
_cachedAssemblyCount = currentAssemblyCount;
|
|
return __state = true;
|
|
}
|
|
|
|
__result = _cachedTypes;
|
|
return __state = false;
|
|
}
|
|
|
|
[MethodImpl(MethodImplOptions.AggressiveInlining)]
|
|
public static void Postfix(ref IEnumerable<Type> __result, bool __state)
|
|
{
|
|
if (!__state)
|
|
return;
|
|
|
|
UpdateCache(ref __result);
|
|
}
|
|
|
|
[MethodImpl(MethodImplOptions.NoInlining)]
|
|
private static void UpdateCache(ref IEnumerable<Type> __result) => __result = _cachedTypes = __result.ToArray();
|
|
|
|
private static Type[] _cachedTypes = Type.EmptyTypes;
|
|
private static int _cachedAssemblyCount;
|
|
}
|
|
} |