Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

perf: reduce networkbehaviourilpp type resolution time #3227

Original file line number Diff line number Diff line change
Expand Up @@ -963,18 +963,60 @@ private bool ImportReferences(ModuleDefinition moduleDefinition, string[] assemb

foreach (var method in type.Methods)
{
// to reduce unnecessary type resolution, we first check if it can be a serialization extension without type resolution

if (!method.IsStatic)
{
continue;
}

if (method.Name is not (k_WriteValueMethodName or k_ReadValueMethodName))
{
continue;
}

var mayHaveExtensionAttr = false;

foreach (var attr in method.CustomAttributes)
{
if (attr.Constructor.DeclaringType.FullName == extensionConstructor.DeclaringType.FullName)
{
mayHaveExtensionAttr = true;
break;
}
}

if (!mayHaveExtensionAttr)
{
continue;
}

var parameters = method.Parameters;

if (parameters.Count != 2)
{
continue;
}

var firstParameterType = parameters[0].ParameterType;

// ReadValueSafe() and WriteValueSafe() can use both by-ref and non-by-ref type for the first parameter type
var firstParameterElementType = firstParameterType is ByReferenceType byRefType ? byRefType.ElementType : firstParameterType;

if (firstParameterElementType.FullName != m_FastBufferWriter_TypeRef.FullName && firstParameterElementType.FullName != m_FastBufferReader_TypeRef.FullName)
{
continue;
}

var isExtension = false;

foreach (var attr in method.CustomAttributes)
{
if (attr.Constructor.Resolve() == extensionConstructor.Resolve())
if (attr.Constructor.DeclaringType.FullName == extensionConstructor.DeclaringType.FullName &&
attr.Constructor.Resolve() == extensionConstructor.Resolve())
{
isExtension = true;
break;
}
}

Expand All @@ -983,13 +1025,11 @@ private bool ImportReferences(ModuleDefinition moduleDefinition, string[] assemb
continue;
}

var parameters = method.Parameters;

if (parameters.Count == 2 && parameters[0].ParameterType.Resolve() == m_FastBufferWriter_TypeRef.MakeByReferenceType().Resolve())
if (method.Name == k_WriteValueMethodName && firstParameterType.Resolve() == m_FastBufferWriter_TypeRef.MakeByReferenceType().Resolve())
{
m_FastBufferWriter_ExtensionMethodRefs.Add(m_MainModule.ImportReference(method));
}
else if (parameters.Count == 2 && parameters[0].ParameterType.Resolve() == m_FastBufferReader_TypeRef.MakeByReferenceType().Resolve())
else if (method.Name == k_ReadValueMethodName && firstParameterType.Resolve() == m_FastBufferReader_TypeRef.MakeByReferenceType().Resolve())
{
m_FastBufferReader_ExtensionMethodRefs.Add(m_MainModule.ImportReference(method));
}
Expand Down Expand Up @@ -1789,27 +1829,24 @@ private bool GetWriteMethodForParameter(TypeReference paramType, out MethodRefer
{
var parameters = method.Resolve().Parameters;

if (method.Name == k_WriteValueMethodName)
if (parameters[1].IsIn)
{
if (parameters[1].IsIn)
if (((ByReferenceType)parameters[1].ParameterType).ElementType.FullName == paramType.FullName &&
((ByReferenceType)parameters[1].ParameterType).ElementType.IsArray == paramType.IsArray)
{
if (((ByReferenceType)parameters[1].ParameterType).ElementType.FullName == paramType.FullName &&
((ByReferenceType)parameters[1].ParameterType).ElementType.IsArray == paramType.IsArray)
{
methodRef = method;
m_FastBufferWriter_WriteValue_MethodRefs[assemblyQualifiedName] = methodRef;
return true;
}
methodRef = method;
m_FastBufferWriter_WriteValue_MethodRefs[assemblyQualifiedName] = methodRef;
return true;
}
else
}
else
{
if (parameters[1].ParameterType.FullName == paramType.FullName &&
parameters[1].ParameterType.IsArray == paramType.IsArray)
{
if (parameters[1].ParameterType.FullName == paramType.FullName &&
parameters[1].ParameterType.IsArray == paramType.IsArray)
{
methodRef = method;
m_FastBufferWriter_WriteValue_MethodRefs[assemblyQualifiedName] = methodRef;
return true;
}
methodRef = method;
m_FastBufferWriter_WriteValue_MethodRefs[assemblyQualifiedName] = methodRef;
return true;
}
}
}
Expand Down Expand Up @@ -2025,8 +2062,7 @@ private bool GetReadMethodForParameter(TypeReference paramType, out MethodRefere
foreach (var method in m_FastBufferReader_ExtensionMethodRefs)
{
var parameters = method.Resolve().Parameters;
if (method.Name == k_ReadValueMethodName &&
parameters[1].IsOut &&
if (parameters[1].IsOut &&
((ByReferenceType)parameters[1].ParameterType).ElementType.FullName == paramType.FullName &&
((ByReferenceType)parameters[1].ParameterType).ElementType.IsArray == paramType.IsArray)
{
Expand Down