fix: Eliminate intermediate string in typecache (#2176)
This commit is contained in:
parent
f0f7d44d4d
commit
4beda6a29d
3 changed files with 21 additions and 19 deletions
|
|
@ -234,10 +234,10 @@ public class TypeCache
|
|||
private static ILogger logger = LogFactory.GetLogger(typeof(TypeCache));
|
||||
#endif
|
||||
|
||||
private Dictionary<ulong, Type[]> _nameMap = new();
|
||||
private Dictionary<ulong, Type[]> _nameMapInsensitive = new();
|
||||
private Dictionary<ulong, Type[]> _fullNameMap = new();
|
||||
private Dictionary<ulong, Type[]> _fullNameMapInsensitive = new();
|
||||
private readonly Dictionary<ulong, Type[]> _nameMap = [];
|
||||
private readonly Dictionary<ulong, Type[]> _nameMapInsensitive = [];
|
||||
private readonly Dictionary<ulong, Type[]> _fullNameMap = [];
|
||||
private readonly Dictionary<ulong, Type[]> _fullNameMapInsensitive = [];
|
||||
|
||||
public TypeCache(Assembly asm)
|
||||
{
|
||||
|
|
@ -248,15 +248,6 @@ public class TypeCache
|
|||
var fullNameMap = new Dictionary<string, HashSet<Type>>();
|
||||
var fullNameMapInsensitive = new Dictionary<string, HashSet<Type>>();
|
||||
|
||||
[MethodImpl(MethodImplOptions.AggressiveInlining)]
|
||||
void addTypeToRefs(Type type, string typeName, string fullTypeName)
|
||||
{
|
||||
AddToRefs(type, typeName, nameMap);
|
||||
AddToRefs(type, typeName.ToLower(), nameMapInsensitive);
|
||||
AddToRefs(type, fullTypeName, fullNameMap);
|
||||
AddToRefs(type, fullTypeName.ToLower(), fullNameMapInsensitive);
|
||||
}
|
||||
|
||||
var aliasType = typeof(TypeAliasAttribute);
|
||||
for (var i = 0; i < Types.Length; i++)
|
||||
{
|
||||
|
|
@ -267,7 +258,7 @@ public class TypeCache
|
|||
for (var j = 0; j < alias.Aliases.Length; j++)
|
||||
{
|
||||
var fullTypeName = alias.Aliases[j];
|
||||
var typeName = fullTypeName[(fullTypeName.LastIndexOf('.')+1)..];
|
||||
var typeName = fullTypeName[(fullTypeName.AsSpan().LastIndexOf('.') + 1)..];
|
||||
addTypeToRefs(current, typeName, fullTypeName);
|
||||
}
|
||||
}
|
||||
|
|
@ -322,6 +313,17 @@ public class TypeCache
|
|||
}
|
||||
#endif
|
||||
}
|
||||
|
||||
return;
|
||||
|
||||
[MethodImpl(MethodImplOptions.AggressiveInlining)]
|
||||
void addTypeToRefs(Type type, string typeName, string fullTypeName)
|
||||
{
|
||||
AddToRefs(type, typeName, nameMap);
|
||||
AddToRefs(type, typeName.ToLower(), nameMapInsensitive);
|
||||
AddToRefs(type, fullTypeName, fullNameMap);
|
||||
AddToRefs(type, fullTypeName.ToLower(), fullNameMapInsensitive);
|
||||
}
|
||||
}
|
||||
|
||||
[MethodImpl(MethodImplOptions.AggressiveInlining)]
|
||||
|
|
@ -338,7 +340,7 @@ public class TypeCache
|
|||
}
|
||||
else
|
||||
{
|
||||
refs = new HashSet<Type> { type };
|
||||
refs = [type];
|
||||
map.Add(key, refs);
|
||||
}
|
||||
}
|
||||
|
|
@ -369,12 +371,12 @@ public class TypeCache
|
|||
if (ignoreCase)
|
||||
{
|
||||
var map = full ? cache._fullNameMapInsensitive : cache._nameMapInsensitive;
|
||||
_values = map.TryGetValue(hash, out var values) ? values : Array.Empty<Type>();
|
||||
_values = map.TryGetValue(hash, out var values) ? values : [];
|
||||
}
|
||||
else
|
||||
{
|
||||
var map = full ? cache._fullNameMap : cache._nameMap;
|
||||
_values = map.TryGetValue(hash, out var values) ? values : Array.Empty<Type>();
|
||||
_values = map.TryGetValue(hash, out var values) ? values : [];
|
||||
}
|
||||
|
||||
_index = 0;
|
||||
|
|
|
|||
|
|
@ -167,7 +167,7 @@ public sealed unsafe class BinaryFileReader : IDisposable, IGenericReader
|
|||
public Serial ReadSerial() => _reader.ReadSerial();
|
||||
|
||||
/// <summary>
|
||||
/// Reads the next Byte which helps determin how to read the following Type.
|
||||
/// Reads the next Byte which helps determine how to read the following Type.
|
||||
/// <br>If the byte returns 1 => <see cref="ReadStringRaw"/> and translate into a Type via the <see cref="AssemblyHandler"/></br>
|
||||
/// <br>If the byte returns 2 => <see cref="UnmanagedDataReader.ReadTypeByHash"/></br>
|
||||
/// <br>else return null</br>
|
||||
|
|
|
|||
|
|
@ -218,7 +218,7 @@ public unsafe class UnmanagedDataReader : IGenericReader
|
|||
public Serial ReadSerial() => (Serial)ReadUInt();
|
||||
|
||||
/// <summary>
|
||||
/// Reads the next Byte which helps determin how to read the following Type.
|
||||
/// Reads the next Byte which helps determine how to read the following Type.
|
||||
/// <br>If the byte returns 1 => <see cref="ReadStringRaw"/> and translate into a Type via the <see cref="AssemblyHandler"/></br>
|
||||
/// <br>If the byte returns 2 => <see cref="ReadTypeByHash"/></br>
|
||||
/// <br>else return null</br>
|
||||
|
|
|
|||
Loading…
Add table
Add a link
Reference in a new issue