Skip to content

Commit acb3492

Browse files
perf improvements
1 parent dbe55c9 commit acb3492

33 files changed

Lines changed: 1919 additions & 77 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,12 @@
1+
<Project Sdk="Microsoft.NET.Sdk">
2+
3+
<PropertyGroup>
4+
<!-- Override target framework to match Payload.Xml project -->
5+
<TargetFramework>net8.0</TargetFramework>
6+
</PropertyGroup>
7+
8+
<ItemGroup>
9+
<ProjectReference Include="..\..\TestProjects\Spector\http\payload\xml\src\Payload.Xml.csproj" />
10+
</ItemGroup>
11+
12+
</Project>
Lines changed: 34 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,34 @@
1+
// Copyright (c) Microsoft Corporation. All rights reserved.
2+
// Licensed under the MIT License.
3+
4+
using BenchmarkDotNet.Configs;
5+
using BenchmarkDotNet.Diagnosers;
6+
using BenchmarkDotNet.Jobs;
7+
using BenchmarkDotNet.Running;
8+
using Perfolizer.Horology;
9+
10+
namespace Microsoft.TypeSpec.Generator.ClientModel.Perf;
11+
12+
public class Program
13+
{
14+
public static void Main(string[] args)
15+
{
16+
// To see the list of benchmarks that can be run
17+
// dotnet run -c Release --framework net10.0 --list flat
18+
19+
// To run a specific benchmark class
20+
// dotnet run -c Release --framework net10.0 --filter *XmlSerializationBenchmark*
21+
22+
// To run all benchmarks
23+
// dotnet run -c Release --framework net10.0
24+
25+
var config = ManualConfig.Create(DefaultConfig.Instance)
26+
.AddDiagnoser(MemoryDiagnoser.Default)
27+
.AddJob(Job.Default
28+
.WithWarmupCount(3)
29+
.WithIterationCount(10)
30+
.WithIterationTime(TimeInterval.FromMilliseconds(250)));
31+
32+
BenchmarkSwitcher.FromAssembly(typeof(Program).Assembly).Run(args, config);
33+
}
34+
}
Lines changed: 140 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,140 @@
1+
// Copyright (c) Microsoft Corporation. All rights reserved.
2+
// Licensed under the MIT License.
3+
4+
using System;
5+
using System.ClientModel.Primitives;
6+
using System.Collections.Generic;
7+
using System.IO;
8+
using System.Xml;
9+
using System.Xml.Linq;
10+
using BenchmarkDotNet.Attributes;
11+
using Payload.Xml;
12+
13+
namespace Microsoft.TypeSpec.Generator.ClientModel.Perf;
14+
15+
/// <summary>
16+
/// Benchmarks comparing streaming vs DOM-based XML serialization approaches
17+
/// for nested model serialization using generated Payload.Xml models.
18+
/// </summary>
19+
[MemoryDiagnoser]
20+
public class XmlSerializationBenchmark
21+
{
22+
private static readonly ModelReaderWriterOptions WireOptions = new("W");
23+
24+
private ModelWithArrayOfModel _smallModel = null!;
25+
private ModelWithArrayOfModel _mediumModel = null!;
26+
private ModelWithArrayOfModel _largeModel = null!;
27+
28+
[GlobalSetup]
29+
public void Setup()
30+
{
31+
_smallModel = CreateModel(10);
32+
_mediumModel = CreateModel(100);
33+
_largeModel = CreateModel(1000);
34+
}
35+
36+
private static ModelWithArrayOfModel CreateModel(int itemCount)
37+
{
38+
var items = new List<SimpleModel>(itemCount);
39+
for (int i = 0; i < itemCount; i++)
40+
{
41+
items.Add(new SimpleModel($"Name{i}", i));
42+
}
43+
return new ModelWithArrayOfModel(items);
44+
}
45+
46+
// ========== Small Model (10 items) ==========
47+
48+
[Benchmark(Description = "Small (10) - DOM")]
49+
public void SmallModel_DomApproach()
50+
{
51+
SerializeWithDomApproach(_smallModel);
52+
}
53+
54+
[Benchmark(Description = "Small (10) - Streaming")]
55+
public void SmallModel_StreamingApproach()
56+
{
57+
SerializeWithStreamingApproach(_smallModel);
58+
}
59+
60+
// ========== Medium Model (100 items) ==========
61+
62+
[Benchmark(Description = "Medium (100) - DOM")]
63+
public void MediumModel_DomApproach()
64+
{
65+
SerializeWithDomApproach(_mediumModel);
66+
}
67+
68+
[Benchmark(Description = "Medium (100) - Streaming")]
69+
public void MediumModel_StreamingApproach()
70+
{
71+
SerializeWithStreamingApproach(_mediumModel);
72+
}
73+
74+
// ========== Large Model (1000 items) ==========
75+
76+
[Benchmark(Description = "Large (1000) - DOM")]
77+
public void LargeModel_DomApproach()
78+
{
79+
SerializeWithDomApproach(_largeModel);
80+
}
81+
82+
[Benchmark(Description = "Large (1000) - Streaming")]
83+
public void LargeModel_StreamingApproach()
84+
{
85+
SerializeWithStreamingApproach(_largeModel);
86+
}
87+
88+
/// <summary>
89+
/// Previous approach: Load into XElement DOM, then write to target.
90+
/// Simulates the old WriteObjectValue implementation.
91+
/// </summary>
92+
private static void SerializeWithDomApproach(ModelWithArrayOfModel model)
93+
{
94+
using var outputStream = new MemoryStream();
95+
using var writer = XmlWriter.Create(outputStream);
96+
97+
writer.WriteStartElement("Root");
98+
writer.WriteStartElement("items");
99+
100+
foreach (var item in model.Items)
101+
{
102+
// Serialize the model to BinaryData (as IPersistableModel does)
103+
BinaryData data = ModelReaderWriter.Write(item, WireOptions);
104+
using Stream stream = data.ToStream();
105+
106+
// DOM approach: parse into XElement, then write
107+
XElement element = XElement.Load(stream, LoadOptions.None);
108+
element.WriteTo(writer);
109+
}
110+
111+
writer.WriteEndElement(); // items
112+
writer.WriteEndElement(); // Root
113+
writer.Flush();
114+
}
115+
116+
/// <summary>
117+
/// New approach: Uses the actual generated WriteObjectValue extension method
118+
/// which streams directly using XmlReader + WriteNode.
119+
/// </summary>
120+
private static void SerializeWithStreamingApproach(ModelWithArrayOfModel model)
121+
{
122+
using var outputStream = new MemoryStream();
123+
using var writer = XmlWriter.Create(outputStream);
124+
125+
writer.WriteStartElement("Root");
126+
writer.WriteStartElement("items");
127+
128+
foreach (var item in model.Items)
129+
{
130+
// Use the actual generated extension method
131+
writer.WriteStartElement("SimpleModel");
132+
writer.WriteObjectValue(item, WireOptions);
133+
writer.WriteEndElement();
134+
}
135+
136+
writer.WriteEndElement(); // items
137+
writer.WriteEndElement(); // Root
138+
writer.Flush();
139+
}
140+
}

packages/http-client-csharp/generator/Microsoft.TypeSpec.Generator.sln

Lines changed: 124 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -1,7 +1,7 @@
11

22
Microsoft Visual Studio Solution File, Format Version 12.00
3-
# Visual Studio Version 17
4-
VisualStudioVersion = 17.8.34309.116
3+
# Visual Studio Version 18
4+
VisualStudioVersion = 18.1.11312.151 d18.0
55
MinimumVisualStudioVersion = 10.0.40219.1
66
Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "Microsoft.TypeSpec.Generator", "Microsoft.TypeSpec.Generator\src\Microsoft.TypeSpec.Generator.csproj", "{7EEF73B1-5CA2-45A1-B1B9-E076417946EC}"
77
EndProject
@@ -27,62 +27,184 @@ Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "Microsoft.TypeSpec.Generato
2727
EndProject
2828
Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "TestProjects.Spector.Tests", "TestProjects\Spector.Tests\TestProjects.Spector.Tests.csproj", "{759C04FA-D7A0-49EE-9990-70C87C34413E}"
2929
EndProject
30+
Project("{2150E333-8FDC-42A3-9474-1A3956D46DE8}") = "perf", "perf", "{F2516DF7-0D14-27EF-5F40-338A7986ED0A}"
31+
EndProject
32+
Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "Microsoft.TypeSpec.Generator.ClientModel.Tests.Perf", "Microsoft.TypeSpec.Generator.ClientModel\perf\Microsoft.TypeSpec.Generator.ClientModel.Tests.Perf.csproj", "{A79CBE39-1D57-491D-A7F6-10DEE57E752D}"
33+
EndProject
3034
Global
3135
GlobalSection(SolutionConfigurationPlatforms) = preSolution
3236
Debug|Any CPU = Debug|Any CPU
37+
Debug|x64 = Debug|x64
38+
Debug|x86 = Debug|x86
3339
Release|Any CPU = Release|Any CPU
40+
Release|x64 = Release|x64
41+
Release|x86 = Release|x86
3442
EndGlobalSection
3543
GlobalSection(ProjectConfigurationPlatforms) = postSolution
3644
{7EEF73B1-5CA2-45A1-B1B9-E076417946EC}.Debug|Any CPU.ActiveCfg = Debug|Any CPU
3745
{7EEF73B1-5CA2-45A1-B1B9-E076417946EC}.Debug|Any CPU.Build.0 = Debug|Any CPU
46+
{7EEF73B1-5CA2-45A1-B1B9-E076417946EC}.Debug|x64.ActiveCfg = Debug|Any CPU
47+
{7EEF73B1-5CA2-45A1-B1B9-E076417946EC}.Debug|x64.Build.0 = Debug|Any CPU
48+
{7EEF73B1-5CA2-45A1-B1B9-E076417946EC}.Debug|x86.ActiveCfg = Debug|Any CPU
49+
{7EEF73B1-5CA2-45A1-B1B9-E076417946EC}.Debug|x86.Build.0 = Debug|Any CPU
3850
{7EEF73B1-5CA2-45A1-B1B9-E076417946EC}.Release|Any CPU.ActiveCfg = Release|Any CPU
3951
{7EEF73B1-5CA2-45A1-B1B9-E076417946EC}.Release|Any CPU.Build.0 = Release|Any CPU
52+
{7EEF73B1-5CA2-45A1-B1B9-E076417946EC}.Release|x64.ActiveCfg = Release|Any CPU
53+
{7EEF73B1-5CA2-45A1-B1B9-E076417946EC}.Release|x64.Build.0 = Release|Any CPU
54+
{7EEF73B1-5CA2-45A1-B1B9-E076417946EC}.Release|x86.ActiveCfg = Release|Any CPU
55+
{7EEF73B1-5CA2-45A1-B1B9-E076417946EC}.Release|x86.Build.0 = Release|Any CPU
4056
{2840CEEB-0F27-42F0-9515-9A57E1BD2573}.Debug|Any CPU.ActiveCfg = Debug|Any CPU
4157
{2840CEEB-0F27-42F0-9515-9A57E1BD2573}.Debug|Any CPU.Build.0 = Debug|Any CPU
58+
{2840CEEB-0F27-42F0-9515-9A57E1BD2573}.Debug|x64.ActiveCfg = Debug|Any CPU
59+
{2840CEEB-0F27-42F0-9515-9A57E1BD2573}.Debug|x64.Build.0 = Debug|Any CPU
60+
{2840CEEB-0F27-42F0-9515-9A57E1BD2573}.Debug|x86.ActiveCfg = Debug|Any CPU
61+
{2840CEEB-0F27-42F0-9515-9A57E1BD2573}.Debug|x86.Build.0 = Debug|Any CPU
4262
{2840CEEB-0F27-42F0-9515-9A57E1BD2573}.Release|Any CPU.ActiveCfg = Release|Any CPU
4363
{2840CEEB-0F27-42F0-9515-9A57E1BD2573}.Release|Any CPU.Build.0 = Release|Any CPU
64+
{2840CEEB-0F27-42F0-9515-9A57E1BD2573}.Release|x64.ActiveCfg = Release|Any CPU
65+
{2840CEEB-0F27-42F0-9515-9A57E1BD2573}.Release|x64.Build.0 = Release|Any CPU
66+
{2840CEEB-0F27-42F0-9515-9A57E1BD2573}.Release|x86.ActiveCfg = Release|Any CPU
67+
{2840CEEB-0F27-42F0-9515-9A57E1BD2573}.Release|x86.Build.0 = Release|Any CPU
4468
{90E671A6-EFDE-41D7-97B7-E5A121FD36BB}.Debug|Any CPU.ActiveCfg = Debug|Any CPU
4569
{90E671A6-EFDE-41D7-97B7-E5A121FD36BB}.Debug|Any CPU.Build.0 = Debug|Any CPU
70+
{90E671A6-EFDE-41D7-97B7-E5A121FD36BB}.Debug|x64.ActiveCfg = Debug|Any CPU
71+
{90E671A6-EFDE-41D7-97B7-E5A121FD36BB}.Debug|x64.Build.0 = Debug|Any CPU
72+
{90E671A6-EFDE-41D7-97B7-E5A121FD36BB}.Debug|x86.ActiveCfg = Debug|Any CPU
73+
{90E671A6-EFDE-41D7-97B7-E5A121FD36BB}.Debug|x86.Build.0 = Debug|Any CPU
4674
{90E671A6-EFDE-41D7-97B7-E5A121FD36BB}.Release|Any CPU.ActiveCfg = Release|Any CPU
4775
{90E671A6-EFDE-41D7-97B7-E5A121FD36BB}.Release|Any CPU.Build.0 = Release|Any CPU
76+
{90E671A6-EFDE-41D7-97B7-E5A121FD36BB}.Release|x64.ActiveCfg = Release|Any CPU
77+
{90E671A6-EFDE-41D7-97B7-E5A121FD36BB}.Release|x64.Build.0 = Release|Any CPU
78+
{90E671A6-EFDE-41D7-97B7-E5A121FD36BB}.Release|x86.ActiveCfg = Release|Any CPU
79+
{90E671A6-EFDE-41D7-97B7-E5A121FD36BB}.Release|x86.Build.0 = Release|Any CPU
4880
{4E1A8C8C-8201-4D49-8296-FCFB2C2D9BB7}.Debug|Any CPU.ActiveCfg = Debug|Any CPU
4981
{4E1A8C8C-8201-4D49-8296-FCFB2C2D9BB7}.Debug|Any CPU.Build.0 = Debug|Any CPU
82+
{4E1A8C8C-8201-4D49-8296-FCFB2C2D9BB7}.Debug|x64.ActiveCfg = Debug|Any CPU
83+
{4E1A8C8C-8201-4D49-8296-FCFB2C2D9BB7}.Debug|x64.Build.0 = Debug|Any CPU
84+
{4E1A8C8C-8201-4D49-8296-FCFB2C2D9BB7}.Debug|x86.ActiveCfg = Debug|Any CPU
85+
{4E1A8C8C-8201-4D49-8296-FCFB2C2D9BB7}.Debug|x86.Build.0 = Debug|Any CPU
5086
{4E1A8C8C-8201-4D49-8296-FCFB2C2D9BB7}.Release|Any CPU.ActiveCfg = Release|Any CPU
5187
{4E1A8C8C-8201-4D49-8296-FCFB2C2D9BB7}.Release|Any CPU.Build.0 = Release|Any CPU
88+
{4E1A8C8C-8201-4D49-8296-FCFB2C2D9BB7}.Release|x64.ActiveCfg = Release|Any CPU
89+
{4E1A8C8C-8201-4D49-8296-FCFB2C2D9BB7}.Release|x64.Build.0 = Release|Any CPU
90+
{4E1A8C8C-8201-4D49-8296-FCFB2C2D9BB7}.Release|x86.ActiveCfg = Release|Any CPU
91+
{4E1A8C8C-8201-4D49-8296-FCFB2C2D9BB7}.Release|x86.Build.0 = Release|Any CPU
5292
{18D447D7-851A-4314-A6E4-9110B03C5091}.Debug|Any CPU.ActiveCfg = Debug|Any CPU
5393
{18D447D7-851A-4314-A6E4-9110B03C5091}.Debug|Any CPU.Build.0 = Debug|Any CPU
94+
{18D447D7-851A-4314-A6E4-9110B03C5091}.Debug|x64.ActiveCfg = Debug|Any CPU
95+
{18D447D7-851A-4314-A6E4-9110B03C5091}.Debug|x64.Build.0 = Debug|Any CPU
96+
{18D447D7-851A-4314-A6E4-9110B03C5091}.Debug|x86.ActiveCfg = Debug|Any CPU
97+
{18D447D7-851A-4314-A6E4-9110B03C5091}.Debug|x86.Build.0 = Debug|Any CPU
5498
{18D447D7-851A-4314-A6E4-9110B03C5091}.Release|Any CPU.ActiveCfg = Release|Any CPU
5599
{18D447D7-851A-4314-A6E4-9110B03C5091}.Release|Any CPU.Build.0 = Release|Any CPU
100+
{18D447D7-851A-4314-A6E4-9110B03C5091}.Release|x64.ActiveCfg = Release|Any CPU
101+
{18D447D7-851A-4314-A6E4-9110B03C5091}.Release|x64.Build.0 = Release|Any CPU
102+
{18D447D7-851A-4314-A6E4-9110B03C5091}.Release|x86.ActiveCfg = Release|Any CPU
103+
{18D447D7-851A-4314-A6E4-9110B03C5091}.Release|x86.Build.0 = Release|Any CPU
56104
{09634A94-4D71-407A-A71A-E02C000A9A9B}.Debug|Any CPU.ActiveCfg = Debug|Any CPU
57105
{09634A94-4D71-407A-A71A-E02C000A9A9B}.Debug|Any CPU.Build.0 = Debug|Any CPU
106+
{09634A94-4D71-407A-A71A-E02C000A9A9B}.Debug|x64.ActiveCfg = Debug|Any CPU
107+
{09634A94-4D71-407A-A71A-E02C000A9A9B}.Debug|x64.Build.0 = Debug|Any CPU
108+
{09634A94-4D71-407A-A71A-E02C000A9A9B}.Debug|x86.ActiveCfg = Debug|Any CPU
109+
{09634A94-4D71-407A-A71A-E02C000A9A9B}.Debug|x86.Build.0 = Debug|Any CPU
58110
{09634A94-4D71-407A-A71A-E02C000A9A9B}.Release|Any CPU.ActiveCfg = Release|Any CPU
59111
{09634A94-4D71-407A-A71A-E02C000A9A9B}.Release|Any CPU.Build.0 = Release|Any CPU
112+
{09634A94-4D71-407A-A71A-E02C000A9A9B}.Release|x64.ActiveCfg = Release|Any CPU
113+
{09634A94-4D71-407A-A71A-E02C000A9A9B}.Release|x64.Build.0 = Release|Any CPU
114+
{09634A94-4D71-407A-A71A-E02C000A9A9B}.Release|x86.ActiveCfg = Release|Any CPU
115+
{09634A94-4D71-407A-A71A-E02C000A9A9B}.Release|x86.Build.0 = Release|Any CPU
60116
{9F5538CA-8C0E-49AE-8F16-E4BBBD1540BC}.Debug|Any CPU.ActiveCfg = Debug|Any CPU
61117
{9F5538CA-8C0E-49AE-8F16-E4BBBD1540BC}.Debug|Any CPU.Build.0 = Debug|Any CPU
118+
{9F5538CA-8C0E-49AE-8F16-E4BBBD1540BC}.Debug|x64.ActiveCfg = Debug|Any CPU
119+
{9F5538CA-8C0E-49AE-8F16-E4BBBD1540BC}.Debug|x64.Build.0 = Debug|Any CPU
120+
{9F5538CA-8C0E-49AE-8F16-E4BBBD1540BC}.Debug|x86.ActiveCfg = Debug|Any CPU
121+
{9F5538CA-8C0E-49AE-8F16-E4BBBD1540BC}.Debug|x86.Build.0 = Debug|Any CPU
62122
{9F5538CA-8C0E-49AE-8F16-E4BBBD1540BC}.Release|Any CPU.ActiveCfg = Release|Any CPU
63123
{9F5538CA-8C0E-49AE-8F16-E4BBBD1540BC}.Release|Any CPU.Build.0 = Release|Any CPU
124+
{9F5538CA-8C0E-49AE-8F16-E4BBBD1540BC}.Release|x64.ActiveCfg = Release|Any CPU
125+
{9F5538CA-8C0E-49AE-8F16-E4BBBD1540BC}.Release|x64.Build.0 = Release|Any CPU
126+
{9F5538CA-8C0E-49AE-8F16-E4BBBD1540BC}.Release|x86.ActiveCfg = Release|Any CPU
127+
{9F5538CA-8C0E-49AE-8F16-E4BBBD1540BC}.Release|x86.Build.0 = Release|Any CPU
64128
{15EF2E31-8CCA-488F-BDA7-D5C74A6B321F}.Debug|Any CPU.ActiveCfg = Debug|Any CPU
65129
{15EF2E31-8CCA-488F-BDA7-D5C74A6B321F}.Debug|Any CPU.Build.0 = Debug|Any CPU
130+
{15EF2E31-8CCA-488F-BDA7-D5C74A6B321F}.Debug|x64.ActiveCfg = Debug|Any CPU
131+
{15EF2E31-8CCA-488F-BDA7-D5C74A6B321F}.Debug|x64.Build.0 = Debug|Any CPU
132+
{15EF2E31-8CCA-488F-BDA7-D5C74A6B321F}.Debug|x86.ActiveCfg = Debug|Any CPU
133+
{15EF2E31-8CCA-488F-BDA7-D5C74A6B321F}.Debug|x86.Build.0 = Debug|Any CPU
66134
{15EF2E31-8CCA-488F-BDA7-D5C74A6B321F}.Release|Any CPU.ActiveCfg = Release|Any CPU
67135
{15EF2E31-8CCA-488F-BDA7-D5C74A6B321F}.Release|Any CPU.Build.0 = Release|Any CPU
136+
{15EF2E31-8CCA-488F-BDA7-D5C74A6B321F}.Release|x64.ActiveCfg = Release|Any CPU
137+
{15EF2E31-8CCA-488F-BDA7-D5C74A6B321F}.Release|x64.Build.0 = Release|Any CPU
138+
{15EF2E31-8CCA-488F-BDA7-D5C74A6B321F}.Release|x86.ActiveCfg = Release|Any CPU
139+
{15EF2E31-8CCA-488F-BDA7-D5C74A6B321F}.Release|x86.Build.0 = Release|Any CPU
68140
{660A87FC-B41C-4A75-B031-065D9950EE02}.Debug|Any CPU.ActiveCfg = Debug|Any CPU
69141
{660A87FC-B41C-4A75-B031-065D9950EE02}.Debug|Any CPU.Build.0 = Debug|Any CPU
142+
{660A87FC-B41C-4A75-B031-065D9950EE02}.Debug|x64.ActiveCfg = Debug|Any CPU
143+
{660A87FC-B41C-4A75-B031-065D9950EE02}.Debug|x64.Build.0 = Debug|Any CPU
144+
{660A87FC-B41C-4A75-B031-065D9950EE02}.Debug|x86.ActiveCfg = Debug|Any CPU
145+
{660A87FC-B41C-4A75-B031-065D9950EE02}.Debug|x86.Build.0 = Debug|Any CPU
70146
{660A87FC-B41C-4A75-B031-065D9950EE02}.Release|Any CPU.ActiveCfg = Release|Any CPU
71147
{660A87FC-B41C-4A75-B031-065D9950EE02}.Release|Any CPU.Build.0 = Release|Any CPU
148+
{660A87FC-B41C-4A75-B031-065D9950EE02}.Release|x64.ActiveCfg = Release|Any CPU
149+
{660A87FC-B41C-4A75-B031-065D9950EE02}.Release|x64.Build.0 = Release|Any CPU
150+
{660A87FC-B41C-4A75-B031-065D9950EE02}.Release|x86.ActiveCfg = Release|Any CPU
151+
{660A87FC-B41C-4A75-B031-065D9950EE02}.Release|x86.Build.0 = Release|Any CPU
72152
{501A628F-A571-40F5-818B-2CCE81610A0A}.Debug|Any CPU.ActiveCfg = Debug|Any CPU
73153
{501A628F-A571-40F5-818B-2CCE81610A0A}.Debug|Any CPU.Build.0 = Debug|Any CPU
154+
{501A628F-A571-40F5-818B-2CCE81610A0A}.Debug|x64.ActiveCfg = Debug|Any CPU
155+
{501A628F-A571-40F5-818B-2CCE81610A0A}.Debug|x64.Build.0 = Debug|Any CPU
156+
{501A628F-A571-40F5-818B-2CCE81610A0A}.Debug|x86.ActiveCfg = Debug|Any CPU
157+
{501A628F-A571-40F5-818B-2CCE81610A0A}.Debug|x86.Build.0 = Debug|Any CPU
74158
{501A628F-A571-40F5-818B-2CCE81610A0A}.Release|Any CPU.ActiveCfg = Release|Any CPU
75159
{501A628F-A571-40F5-818B-2CCE81610A0A}.Release|Any CPU.Build.0 = Release|Any CPU
160+
{501A628F-A571-40F5-818B-2CCE81610A0A}.Release|x64.ActiveCfg = Release|Any CPU
161+
{501A628F-A571-40F5-818B-2CCE81610A0A}.Release|x64.Build.0 = Release|Any CPU
162+
{501A628F-A571-40F5-818B-2CCE81610A0A}.Release|x86.ActiveCfg = Release|Any CPU
163+
{501A628F-A571-40F5-818B-2CCE81610A0A}.Release|x86.Build.0 = Release|Any CPU
76164
{97241DB7-7D0B-451C-BC57-3549897ECF0C}.Debug|Any CPU.ActiveCfg = Debug|Any CPU
77165
{97241DB7-7D0B-451C-BC57-3549897ECF0C}.Debug|Any CPU.Build.0 = Debug|Any CPU
166+
{97241DB7-7D0B-451C-BC57-3549897ECF0C}.Debug|x64.ActiveCfg = Debug|Any CPU
167+
{97241DB7-7D0B-451C-BC57-3549897ECF0C}.Debug|x64.Build.0 = Debug|Any CPU
168+
{97241DB7-7D0B-451C-BC57-3549897ECF0C}.Debug|x86.ActiveCfg = Debug|Any CPU
169+
{97241DB7-7D0B-451C-BC57-3549897ECF0C}.Debug|x86.Build.0 = Debug|Any CPU
78170
{97241DB7-7D0B-451C-BC57-3549897ECF0C}.Release|Any CPU.ActiveCfg = Release|Any CPU
79171
{97241DB7-7D0B-451C-BC57-3549897ECF0C}.Release|Any CPU.Build.0 = Release|Any CPU
172+
{97241DB7-7D0B-451C-BC57-3549897ECF0C}.Release|x64.ActiveCfg = Release|Any CPU
173+
{97241DB7-7D0B-451C-BC57-3549897ECF0C}.Release|x64.Build.0 = Release|Any CPU
174+
{97241DB7-7D0B-451C-BC57-3549897ECF0C}.Release|x86.ActiveCfg = Release|Any CPU
175+
{97241DB7-7D0B-451C-BC57-3549897ECF0C}.Release|x86.Build.0 = Release|Any CPU
80176
{759C04FA-D7A0-49EE-9990-70C87C34413E}.Debug|Any CPU.ActiveCfg = Debug|Any CPU
81177
{759C04FA-D7A0-49EE-9990-70C87C34413E}.Debug|Any CPU.Build.0 = Debug|Any CPU
178+
{759C04FA-D7A0-49EE-9990-70C87C34413E}.Debug|x64.ActiveCfg = Debug|Any CPU
179+
{759C04FA-D7A0-49EE-9990-70C87C34413E}.Debug|x64.Build.0 = Debug|Any CPU
180+
{759C04FA-D7A0-49EE-9990-70C87C34413E}.Debug|x86.ActiveCfg = Debug|Any CPU
181+
{759C04FA-D7A0-49EE-9990-70C87C34413E}.Debug|x86.Build.0 = Debug|Any CPU
82182
{759C04FA-D7A0-49EE-9990-70C87C34413E}.Release|Any CPU.ActiveCfg = Release|Any CPU
83183
{759C04FA-D7A0-49EE-9990-70C87C34413E}.Release|Any CPU.Build.0 = Release|Any CPU
184+
{759C04FA-D7A0-49EE-9990-70C87C34413E}.Release|x64.ActiveCfg = Release|Any CPU
185+
{759C04FA-D7A0-49EE-9990-70C87C34413E}.Release|x64.Build.0 = Release|Any CPU
186+
{759C04FA-D7A0-49EE-9990-70C87C34413E}.Release|x86.ActiveCfg = Release|Any CPU
187+
{759C04FA-D7A0-49EE-9990-70C87C34413E}.Release|x86.Build.0 = Release|Any CPU
188+
{A79CBE39-1D57-491D-A7F6-10DEE57E752D}.Debug|Any CPU.ActiveCfg = Debug|Any CPU
189+
{A79CBE39-1D57-491D-A7F6-10DEE57E752D}.Debug|Any CPU.Build.0 = Debug|Any CPU
190+
{A79CBE39-1D57-491D-A7F6-10DEE57E752D}.Debug|x64.ActiveCfg = Debug|Any CPU
191+
{A79CBE39-1D57-491D-A7F6-10DEE57E752D}.Debug|x64.Build.0 = Debug|Any CPU
192+
{A79CBE39-1D57-491D-A7F6-10DEE57E752D}.Debug|x86.ActiveCfg = Debug|Any CPU
193+
{A79CBE39-1D57-491D-A7F6-10DEE57E752D}.Debug|x86.Build.0 = Debug|Any CPU
194+
{A79CBE39-1D57-491D-A7F6-10DEE57E752D}.Release|Any CPU.ActiveCfg = Release|Any CPU
195+
{A79CBE39-1D57-491D-A7F6-10DEE57E752D}.Release|Any CPU.Build.0 = Release|Any CPU
196+
{A79CBE39-1D57-491D-A7F6-10DEE57E752D}.Release|x64.ActiveCfg = Release|Any CPU
197+
{A79CBE39-1D57-491D-A7F6-10DEE57E752D}.Release|x64.Build.0 = Release|Any CPU
198+
{A79CBE39-1D57-491D-A7F6-10DEE57E752D}.Release|x86.ActiveCfg = Release|Any CPU
199+
{A79CBE39-1D57-491D-A7F6-10DEE57E752D}.Release|x86.Build.0 = Release|Any CPU
84200
EndGlobalSection
85201
GlobalSection(SolutionProperties) = preSolution
86202
HideSolutionNode = FALSE
87203
EndGlobalSection
204+
GlobalSection(NestedProjects) = preSolution
205+
{A79CBE39-1D57-491D-A7F6-10DEE57E752D} = {F2516DF7-0D14-27EF-5F40-338A7986ED0A}
206+
EndGlobalSection
207+
GlobalSection(ExtensibilityGlobals) = postSolution
208+
SolutionGuid = {0EE62719-18C1-4A58-AE9D-6C170BE9AEE1}
209+
EndGlobalSection
88210
EndGlobal

0 commit comments

Comments
 (0)