Description
XmlConfigurationLoader.ParseConfigFrom() creates a new XmlSerializer(typeof(ReferenceCopConfig)) each time it's called. XmlSerializer constructors dynamically generate and compile a serialization assembly at runtime.
Affected Files
src/ReferenceCop/Configuration/XmlConfigurationLoader.cs (line ~48, ParseConfigFrom method)
Impact
- Startup cost: Each
new XmlSerializer() triggers runtime code generation (~50-200ms for complex types), adding latency during analyzer initialization
- Memory leak in .NET Framework: Dynamically generated assemblies are never unloaded in .NET Framework, causing a slow memory leak if the analyzer is invoked repeatedly (e.g., in IDE real-time analysis scenarios)
- Repeated allocation: In MSBuild/Roslyn scenarios where the analyzer initializes per-project, this compounds across the build
Suggested Optimization
Cache the serializer as a static field:
private static readonly XmlSerializer Serializer = new XmlSerializer(typeof(ReferenceCopConfig));
private static ReferenceCopConfig ParseConfigFrom(Stream stream)
{
return (ReferenceCopConfig)Serializer.Deserialize(stream);
}
The XmlSerializer(Type) constructor is thread-safe for the simple single-type form, and the cached instance can be safely shared.
Description
XmlConfigurationLoader.ParseConfigFrom()creates a newXmlSerializer(typeof(ReferenceCopConfig))each time it's called.XmlSerializerconstructors dynamically generate and compile a serialization assembly at runtime.Affected Files
src/ReferenceCop/Configuration/XmlConfigurationLoader.cs(line ~48,ParseConfigFrommethod)Impact
new XmlSerializer()triggers runtime code generation (~50-200ms for complex types), adding latency during analyzer initializationSuggested Optimization
Cache the serializer as a static field:
The
XmlSerializer(Type)constructor is thread-safe for the simple single-type form, and the cached instance can be safely shared.