Performance issue with GetCustomDebugInformation #684

Closed
opened 2020-08-05 02:43:26 -05:00 by marek-safar · 1 comment
marek-safar commented 2020-08-05 02:43:26 -05:00 (Migrated from github.com)

When linking a set of assemblies which contain Microsoft.SourceLink.GitHub with EmbedUntrackedSources enabled, the processing time will increase significantly.

Lots of the processing time is spent in GetCustomDebugInformation : github.com/jbevain/cecil@5e37f44535/Mono.Cecil/AssemblyReader.cs (L3241)

Here's a stack trace leading to this:

 	mscorlib.dll!System.IO.Stream.InternalCopyTo(System.IO.Stream destination, int bufferSize)	Unknown
>	Mono.Cecil.dll!Mono.Cecil.MetadataReader.GetCustomDebugInformation(Mono.Cecil.Cil.ICustomDebugInformationProvider provider) Line 3242	C#
 	Mono.Cecil.dll!Mono.Cecil.MetadataReader.GetDocument(uint rid) Line 2881	C#
 	Mono.Cecil.dll!Mono.Cecil.MetadataReader.ReadSequencePoints(Mono.Cecil.MethodDefinition method) Line 2870	C#
 	Mono.Cecil.dll!Mono.Cecil.Cil.PortablePdbReader.Read(Mono.Cecil.MethodDefinition method) Line 118	C#
 	Mono.Cecil.dll!Mono.Cecil.Cil.CodeReader.ReadMethodBody() Line 109	C#
 	Mono.Cecil.dll!Mono.Cecil.Cil.CodeReader.ReadMethodBody(Mono.Cecil.MethodDefinition method) Line 61	C#
 	Mono.Cecil.dll!Mono.Cecil.MethodDefinition.get_Body.AnonymousMethod__41_0(Mono.Cecil.MethodDefinition method, Mono.Cecil.MetadataReader reader) Line 154	C#
 	Mono.Cecil.dll!Mono.Cecil.ModuleDefinition.Read<System.__Canon, System.__Canon>(ref System.__Canon variable, System.__Canon item, System.Func<System.__Canon, Mono.Cecil.MetadataReader, System.__Canon> read) Line 989	C#
 	Mono.Cecil.dll!Mono.Cecil.MethodDefinition.Body.get() Line 156	C#
 	monolinker.exe!Mono.Linker.Steps.RemoveUnreachableBlocksStep.RewriteBody(Mono.Cecil.MethodDefinition method) Line 129	C#
 	monolinker.exe!Mono.Linker.Steps.RemoveUnreachableBlocksStep.RewriteBodies(Mono.Collections.Generic.Collection<Mono.Cecil.TypeDefinition> types) Line 119	C#
 	monolinker.exe!Mono.Linker.Steps.RemoveUnreachableBlocksStep.Process() Line 45	C#
 	monolinker.exe!Mono.Linker.Steps.BaseStep.Process(Mono.Linker.LinkContext context) Line 60	C#
 	monolinker.exe!Mono.Linker.Pipeline.ProcessStep(Mono.Linker.LinkContext context, Mono.Linker.Steps.IStep step) Line 134	C#
 	monolinker.exe!Mono.Linker.Pipeline.Process(Mono.Linker.LinkContext context) Line 127	C#
 	monolinker.exe!Mono.Linker.Driver.Run(Mono.Linker.ILogger customLogger) Line 609	C#
 	monolinker.exe!Mono.Linker.Driver.Execute(string[] args, Mono.Linker.ILogger customLogger) Line 67	C#
 	monolinker.exe!Mono.Linker.Driver.Main(string[] args) Line 51	C#

Originally reported as https://github.com/mono/linker/issues/1409

When linking a set of assemblies which contain `Microsoft.SourceLink.GitHub` with `EmbedUntrackedSources` enabled, the processing time will increase significantly. Lots of the processing time is spent in `GetCustomDebugInformation` : https://github.com/jbevain/cecil/blob/5e37f44535e0753ff3e4dbdef4ef148ca8bb09e0/Mono.Cecil/AssemblyReader.cs#L3241 Here's a stack trace leading to this: ``` mscorlib.dll!System.IO.Stream.InternalCopyTo(System.IO.Stream destination, int bufferSize) Unknown > Mono.Cecil.dll!Mono.Cecil.MetadataReader.GetCustomDebugInformation(Mono.Cecil.Cil.ICustomDebugInformationProvider provider) Line 3242 C# Mono.Cecil.dll!Mono.Cecil.MetadataReader.GetDocument(uint rid) Line 2881 C# Mono.Cecil.dll!Mono.Cecil.MetadataReader.ReadSequencePoints(Mono.Cecil.MethodDefinition method) Line 2870 C# Mono.Cecil.dll!Mono.Cecil.Cil.PortablePdbReader.Read(Mono.Cecil.MethodDefinition method) Line 118 C# Mono.Cecil.dll!Mono.Cecil.Cil.CodeReader.ReadMethodBody() Line 109 C# Mono.Cecil.dll!Mono.Cecil.Cil.CodeReader.ReadMethodBody(Mono.Cecil.MethodDefinition method) Line 61 C# Mono.Cecil.dll!Mono.Cecil.MethodDefinition.get_Body.AnonymousMethod__41_0(Mono.Cecil.MethodDefinition method, Mono.Cecil.MetadataReader reader) Line 154 C# Mono.Cecil.dll!Mono.Cecil.ModuleDefinition.Read<System.__Canon, System.__Canon>(ref System.__Canon variable, System.__Canon item, System.Func<System.__Canon, Mono.Cecil.MetadataReader, System.__Canon> read) Line 989 C# Mono.Cecil.dll!Mono.Cecil.MethodDefinition.Body.get() Line 156 C# monolinker.exe!Mono.Linker.Steps.RemoveUnreachableBlocksStep.RewriteBody(Mono.Cecil.MethodDefinition method) Line 129 C# monolinker.exe!Mono.Linker.Steps.RemoveUnreachableBlocksStep.RewriteBodies(Mono.Collections.Generic.Collection<Mono.Cecil.TypeDefinition> types) Line 119 C# monolinker.exe!Mono.Linker.Steps.RemoveUnreachableBlocksStep.Process() Line 45 C# monolinker.exe!Mono.Linker.Steps.BaseStep.Process(Mono.Linker.LinkContext context) Line 60 C# monolinker.exe!Mono.Linker.Pipeline.ProcessStep(Mono.Linker.LinkContext context, Mono.Linker.Steps.IStep step) Line 134 C# monolinker.exe!Mono.Linker.Pipeline.Process(Mono.Linker.LinkContext context) Line 127 C# monolinker.exe!Mono.Linker.Driver.Run(Mono.Linker.ILogger customLogger) Line 609 C# monolinker.exe!Mono.Linker.Driver.Execute(string[] args, Mono.Linker.ILogger customLogger) Line 67 C# monolinker.exe!Mono.Linker.Driver.Main(string[] args) Line 51 C# ``` Originally reported as https://github.com/mono/linker/issues/1409
jbevain commented 2020-08-05 16:20:38 -05:00 (Migrated from github.com)

I see. Yeah that makes sense. We probably shouldn't even decompress/compress unless the user asked to access the uncompressed content, that should speed things up.

I see. Yeah that makes sense. We probably shouldn't even decompress/compress unless the user asked to access the uncompressed content, that should speed things up.
Sign in to join this conversation.
No milestone
No assignees
1 participant
Notifications
Due date
The due date is invalid or out of range. Please use the format "yyyy-mm-dd".

No due date set.

Dependencies

No dependencies set

Reference
gh-jbevain/cecil#684
No description provided.