Skip to content

Commit 6c41aba

Browse files
NoelStephensUnityruccho
authored andcommitted
perf: reduce networkbehaviourilpp type resolution time (#3227)
User submitted PR: #3224 ## Measurement With `minimalproject`, I used the following code for measurement. ```diff diff --git a/com.unity.netcode.gameobjects/Editor/CodeGen/NetworkBehaviourILPP.cs b/com.unity.netcode.gameobjects/Editor/CodeGen/NetworkBehaviourILPP.cs index 7e95fea..39b4f991 100644 --- a/com.unity.netcode.gameobjects/Editor/CodeGen/NetworkBehaviourILPP.cs +++ b/com.unity.netcode.gameobjects/Editor/CodeGen/NetworkBehaviourILPP.cs @@ -77,6 +77,8 @@ namespace Unity.Netcode.Editor.CodeGen m_Diagnostics.Clear(); + var sw = System.Diagnostics.Stopwatch.StartNew(); + // read var assemblyDefinition = CodeGenHelpers.AssemblyDefinitionFor(compiledAssembly, out m_AssemblyResolver); if (assemblyDefinition == null) @@ -171,6 +173,8 @@ namespace Unity.Netcode.Editor.CodeGen assemblyDefinition.Write(pe, writerParameters); + m_Diagnostics.AddWarning($"ILPP has completed for {compiledAssembly.Name} in {sw.ElapsedMilliseconds} ms"); + return new ILPostProcessResult(new InMemoryAssembly(pe.ToArray(), pdb.ToArray()), m_Diagnostics); } ``` ### Before ``` (0,0): warning - ILPP has completed for Unity.Netcode.Editor in 531 ms (0,0): warning - ILPP has completed for Unity.Netcode.EditorTests in 604 ms (0,0): warning - ILPP has completed for Unity.Netcode.Components in 363 ms (0,0): warning - ILPP has completed for Unity.Netcode.TestHelpers.Runtime in 330 ms (0,0): warning - ILPP has completed for Unity.Netcode.RuntimeTests in 735 ms ``` ### After ``` (0,0): warning - ILPP has completed for Unity.Netcode.Editor in 79 ms (0,0): warning - ILPP has completed for Unity.Netcode.EditorTests in 128 ms (0,0): warning - ILPP has completed for Unity.Netcode.Components in 146 ms (0,0): warning - ILPP has completed for Unity.Netcode.TestHelpers.Runtime in 117 ms (0,0): warning - ILPP has completed for Unity.Netcode.RuntimeTests in 537 ms ``` ## Changelog - Changed: Improved performance of NetworkBehaviour ILPostProcessor by omitting unnecessary type and assembly resolutions. ## Testing and Documentation - No tests have been added. - No documentation changes or additions were necessary. --------- Co-authored-by: ruccho <noboroo2000@yahoo.co.jp>
1 parent 6b8f88b commit 6c41aba

File tree

1 file changed

+60
-24
lines changed

1 file changed

+60
-24
lines changed

com.unity.netcode.gameobjects/Editor/CodeGen/NetworkBehaviourILPP.cs

Lines changed: 60 additions & 24 deletions
Original file line numberDiff line numberDiff line change
@@ -985,18 +985,60 @@ private bool ImportReferences(ModuleDefinition moduleDefinition, string[] assemb
985985

986986
foreach (var method in type.Methods)
987987
{
988+
// to reduce unnecessary type resolution, we first check if it can be a serialization extension without type resolution
989+
988990
if (!method.IsStatic)
989991
{
990992
continue;
991993
}
992994

995+
if (method.Name is not (k_WriteValueMethodName or k_ReadValueMethodName))
996+
{
997+
continue;
998+
}
999+
1000+
var mayHaveExtensionAttr = false;
1001+
1002+
foreach (var attr in method.CustomAttributes)
1003+
{
1004+
if (attr.Constructor.DeclaringType.FullName == extensionConstructor.DeclaringType.FullName)
1005+
{
1006+
mayHaveExtensionAttr = true;
1007+
break;
1008+
}
1009+
}
1010+
1011+
if (!mayHaveExtensionAttr)
1012+
{
1013+
continue;
1014+
}
1015+
1016+
var parameters = method.Parameters;
1017+
1018+
if (parameters.Count != 2)
1019+
{
1020+
continue;
1021+
}
1022+
1023+
var firstParameterType = parameters[0].ParameterType;
1024+
1025+
// ReadValueSafe() and WriteValueSafe() can use both by-ref and non-by-ref type for the first parameter type
1026+
var firstParameterElementType = firstParameterType is ByReferenceType byRefType ? byRefType.ElementType : firstParameterType;
1027+
1028+
if (firstParameterElementType.FullName != m_FastBufferWriter_TypeRef.FullName && firstParameterElementType.FullName != m_FastBufferReader_TypeRef.FullName)
1029+
{
1030+
continue;
1031+
}
1032+
9931033
var isExtension = false;
9941034

9951035
foreach (var attr in method.CustomAttributes)
9961036
{
997-
if (attr.Constructor.Resolve() == extensionConstructor.Resolve())
1037+
if (attr.Constructor.DeclaringType.FullName == extensionConstructor.DeclaringType.FullName &&
1038+
attr.Constructor.Resolve() == extensionConstructor.Resolve())
9981039
{
9991040
isExtension = true;
1041+
break;
10001042
}
10011043
}
10021044

@@ -1005,13 +1047,11 @@ private bool ImportReferences(ModuleDefinition moduleDefinition, string[] assemb
10051047
continue;
10061048
}
10071049

1008-
var parameters = method.Parameters;
1009-
1010-
if (parameters.Count == 2 && parameters[0].ParameterType.Resolve() == m_FastBufferWriter_TypeRef.MakeByReferenceType().Resolve())
1050+
if (method.Name == k_WriteValueMethodName && firstParameterType.Resolve() == m_FastBufferWriter_TypeRef.MakeByReferenceType().Resolve())
10111051
{
10121052
m_FastBufferWriter_ExtensionMethodRefs.Add(m_MainModule.ImportReference(method));
10131053
}
1014-
else if (parameters.Count == 2 && parameters[0].ParameterType.Resolve() == m_FastBufferReader_TypeRef.MakeByReferenceType().Resolve())
1054+
else if (method.Name == k_ReadValueMethodName && firstParameterType.Resolve() == m_FastBufferReader_TypeRef.MakeByReferenceType().Resolve())
10151055
{
10161056
m_FastBufferReader_ExtensionMethodRefs.Add(m_MainModule.ImportReference(method));
10171057
}
@@ -1861,27 +1901,24 @@ private bool GetWriteMethodForParameter(TypeReference paramType, out MethodRefer
18611901
{
18621902
var parameters = method.Resolve().Parameters;
18631903

1864-
if (method.Name == k_WriteValueMethodName)
1904+
if (parameters[1].IsIn)
18651905
{
1866-
if (parameters[1].IsIn)
1906+
if (((ByReferenceType)parameters[1].ParameterType).ElementType.FullName == paramType.FullName &&
1907+
((ByReferenceType)parameters[1].ParameterType).ElementType.IsArray == paramType.IsArray)
18671908
{
1868-
if (((ByReferenceType)parameters[1].ParameterType).ElementType.FullName == paramType.FullName &&
1869-
((ByReferenceType)parameters[1].ParameterType).ElementType.IsArray == paramType.IsArray)
1870-
{
1871-
methodRef = method;
1872-
m_FastBufferWriter_WriteValue_MethodRefs[assemblyQualifiedName] = methodRef;
1873-
return true;
1874-
}
1909+
methodRef = method;
1910+
m_FastBufferWriter_WriteValue_MethodRefs[assemblyQualifiedName] = methodRef;
1911+
return true;
18751912
}
1876-
else
1913+
}
1914+
else
1915+
{
1916+
if (parameters[1].ParameterType.FullName == paramType.FullName &&
1917+
parameters[1].ParameterType.IsArray == paramType.IsArray)
18771918
{
1878-
if (parameters[1].ParameterType.FullName == paramType.FullName &&
1879-
parameters[1].ParameterType.IsArray == paramType.IsArray)
1880-
{
1881-
methodRef = method;
1882-
m_FastBufferWriter_WriteValue_MethodRefs[assemblyQualifiedName] = methodRef;
1883-
return true;
1884-
}
1919+
methodRef = method;
1920+
m_FastBufferWriter_WriteValue_MethodRefs[assemblyQualifiedName] = methodRef;
1921+
return true;
18851922
}
18861923
}
18871924
}
@@ -2097,8 +2134,7 @@ private bool GetReadMethodForParameter(TypeReference paramType, out MethodRefere
20972134
foreach (var method in m_FastBufferReader_ExtensionMethodRefs)
20982135
{
20992136
var parameters = method.Resolve().Parameters;
2100-
if (method.Name == k_ReadValueMethodName &&
2101-
parameters[1].IsOut &&
2137+
if (parameters[1].IsOut &&
21022138
((ByReferenceType)parameters[1].ParameterType).ElementType.FullName == paramType.FullName &&
21032139
((ByReferenceType)parameters[1].ParameterType).ElementType.IsArray == paramType.IsArray)
21042140
{

0 commit comments

Comments
 (0)