Skip to content

Commit 7ae4ff8

Browse files
committed
Use CollectionMarshall
1 parent e99ec77 commit 7ae4ff8

5 files changed

Lines changed: 73 additions & 12 deletions

File tree

src/DynamoDBGenerator/Internal/MarshallHelper.cs

Lines changed: 15 additions & 10 deletions
Original file line numberDiff line numberDiff line change
@@ -239,7 +239,7 @@ public static HashSet<string> ToStringHashSet(List<string> ss, string? dataMembe
239239
{
240240
return ToStringSet<HashSet<string>>(ss, i => new HashSet<string>(i), dataMember);
241241
}
242-
242+
243243
public static ISet<string?> ToNullableStringISet(List<string?> ss, string? dataMember)
244244
{
245245
return ToNullableStringSet<HashSet<string?>>(ss, i => new HashSet<string?>(i), dataMember);
@@ -259,11 +259,12 @@ public static HashSet<string> ToStringHashSet(List<string> ss, string? dataMembe
259259
{
260260
var span = CollectionsMarshal.AsSpan(ss);
261261
var set = new SortedSet<string?>();
262-
foreach (var se in span)
262+
foreach (var se in span)
263263
set.Add(se);
264264

265265
return set;
266266
}
267+
267268
public static SortedSet<string> ToStringSortedSet(List<string> ss, string? dataMember)
268269
{
269270
var span = CollectionsMarshal.AsSpan(ss);
@@ -411,10 +412,12 @@ public static AttributeValue FromList<T, TArgument>(
411412
string? dataMember,
412413
Func<T, TArgument, string?, AttributeValue> resultSelector)
413414
{
414-
var span = CollectionsMarshal.AsSpan(list);
415-
var attributeValues = new List<AttributeValue>(span.Length);
416-
for (var i = 0; i < span.Length; i++)
417-
attributeValues.Add(resultSelector(span[i], argument, $"{dataMember}[{i}]"));
415+
var fromSpan = CollectionsMarshal.AsSpan(list);
416+
var attributeValues = new List<AttributeValue>(fromSpan.Length);
417+
CollectionsMarshal.SetCount(attributeValues, fromSpan.Length);
418+
var toSpan = CollectionsMarshal.AsSpan(attributeValues);
419+
for (var i = 0; i < fromSpan.Length; i++)
420+
toSpan[i] = resultSelector(fromSpan[i], argument, $"{dataMember}[{i}]");
418421

419422
return new AttributeValue { L = attributeValues };
420423
}
@@ -448,10 +451,12 @@ public static List<TResult> ToList<TResult, TArgument>(
448451
Func<AttributeValue, TArgument, string?, TResult> resultSelector
449452
)
450453
{
451-
var span = CollectionsMarshal.AsSpan(attributeValues);
452-
var elements = new List<TResult>(span.Length);
453-
for (var i = 0; i < span.Length; i++)
454-
elements.Add(resultSelector(span[i], argument, $"{dataMember}[{i}]"));
454+
var fromSpan = CollectionsMarshal.AsSpan(attributeValues);
455+
var elements = new List<TResult>(fromSpan.Length);
456+
CollectionsMarshal.SetCount(elements, fromSpan.Length);
457+
var toSpan = CollectionsMarshal.AsSpan(elements);
458+
for (var i = 0; i < fromSpan.Length; i++)
459+
toSpan[i] = resultSelector(fromSpan[i], argument, $"{dataMember}[{i}]");
455460

456461
return elements;
457462
}
Lines changed: 17 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,17 @@
1+
```
2+
3+
BenchmarkDotNet v0.14.0, Windows 11 (10.0.26100.4484)
4+
Intel Core Ultra 9 185H, 1 CPU, 22 logical and 16 physical cores
5+
.NET SDK 9.0.107
6+
[Host] : .NET 8.0.17 (8.0.1725.26602), X64 RyuJIT AVX2
7+
.NET 8.0 : .NET 8.0.17 (8.0.1725.26602), X64 RyuJIT AVX2
8+
9+
Job=.NET 8.0 Runtime=.NET 8.0
10+
11+
```
12+
| Method | Mean | Error | StdDev | Median | Gen0 | Gen1 | Allocated |
13+
|---------------------------- |-----------:|---------:|----------:|-----------:|-------:|-------:|----------:|
14+
| Marshall_AWS_Reflection | 5,310.1 ns | 28.67 ns | 22.38 ns | 5,311.0 ns | 0.8545 | - | 10875 B |
15+
| Marshall_Source_Generated | 577.9 ns | 46.28 ns | 136.46 ns | 484.8 ns | 0.2375 | 0.0019 | 2984 B |
16+
| Unmarshall_AWS_Reflection | 5,612.6 ns | 60.79 ns | 56.87 ns | 5,625.0 ns | 0.8545 | - | 10922 B |
17+
| Unmarshall_Source_Generated | 870.1 ns | 10.08 ns | 8.93 ns | 873.0 ns | 0.0439 | - | 560 B |
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,5 @@
1+
Method,Job,AnalyzeLaunchVariance,EvaluateOverhead,MaxAbsoluteError,MaxRelativeError,MinInvokeCount,MinIterationTime,OutlierMode,Affinity,EnvironmentVariables,Jit,LargeAddressAware,Platform,PowerPlanMode,Runtime,AllowVeryLargeObjects,Concurrent,CpuGroups,Force,HeapAffinitizeMask,HeapCount,NoAffinitize,RetainVm,Server,Arguments,BuildConfiguration,Clock,EngineFactory,NuGetReferences,Toolchain,IsMutator,InvocationCount,IterationCount,IterationTime,LaunchCount,MaxIterationCount,MaxWarmupIterationCount,MemoryRandomization,MinIterationCount,MinWarmupIterationCount,RunStrategy,UnrollFactor,WarmupCount,Mean,Error,StdDev,Median,Gen0,Gen1,Allocated
2+
Marshall_AWS_Reflection,.NET 8.0,False,Default,Default,Default,Default,Default,Default,1111111111111111111111,Empty,RyuJit,Default,X64,8c5e7fda-e8bf-4a96-9a85-a6e23a8c635c,.NET 8.0,False,True,False,True,Default,Default,False,False,False,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,16,Default,"5,310.1 ns",28.67 ns,22.38 ns,"5,311.0 ns",0.8545,0.0000,10875 B
3+
Marshall_Source_Generated,.NET 8.0,False,Default,Default,Default,Default,Default,Default,1111111111111111111111,Empty,RyuJit,Default,X64,8c5e7fda-e8bf-4a96-9a85-a6e23a8c635c,.NET 8.0,False,True,False,True,Default,Default,False,False,False,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,16,Default,577.9 ns,46.28 ns,136.46 ns,484.8 ns,0.2375,0.0019,2984 B
4+
Unmarshall_AWS_Reflection,.NET 8.0,False,Default,Default,Default,Default,Default,Default,1111111111111111111111,Empty,RyuJit,Default,X64,8c5e7fda-e8bf-4a96-9a85-a6e23a8c635c,.NET 8.0,False,True,False,True,Default,Default,False,False,False,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,16,Default,"5,612.6 ns",60.79 ns,56.87 ns,"5,625.0 ns",0.8545,0.0000,10922 B
5+
Unmarshall_Source_Generated,.NET 8.0,False,Default,Default,Default,Default,Default,Default,1111111111111111111111,Empty,RyuJit,Default,X64,8c5e7fda-e8bf-4a96-9a85-a6e23a8c635c,.NET 8.0,False,True,False,True,Default,Default,False,False,False,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,16,Default,870.1 ns,10.08 ns,8.93 ns,873.0 ns,0.0439,0.0000,560 B
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,34 @@
1+
<!DOCTYPE html>
2+
<html lang='en'>
3+
<head>
4+
<meta charset='utf-8' />
5+
<title>DynamoDBGenerator.SourceGenerator.Benchmarks.MarshallBenchmark-20250629-121942</title>
6+
7+
<style type="text/css">
8+
table { border-collapse: collapse; display: block; width: 100%; overflow: auto; }
9+
td, th { padding: 6px 13px; border: 1px solid #ddd; text-align: right; }
10+
tr { background-color: #fff; border-top: 1px solid #ccc; }
11+
tr:nth-child(even) { background: #f8f8f8; }
12+
</style>
13+
</head>
14+
<body>
15+
<pre><code>
16+
BenchmarkDotNet v0.14.0, Windows 11 (10.0.26100.4484)
17+
Intel Core Ultra 9 185H, 1 CPU, 22 logical and 16 physical cores
18+
.NET SDK 9.0.107
19+
[Host] : .NET 8.0.17 (8.0.1725.26602), X64 RyuJIT AVX2
20+
.NET 8.0 : .NET 8.0.17 (8.0.1725.26602), X64 RyuJIT AVX2
21+
</code></pre>
22+
<pre><code>Job=.NET 8.0 Runtime=.NET 8.0
23+
</code></pre>
24+
25+
<table>
26+
<thead><tr><th>Method </th><th>Mean</th><th>Error</th><th>StdDev</th><th>Median</th><th>Gen0</th><th>Gen1</th><th>Allocated</th>
27+
</tr>
28+
</thead><tbody><tr><td>Marshall_AWS_Reflection</td><td>5,310.1 ns</td><td>28.67 ns</td><td>22.38 ns</td><td>5,311.0 ns</td><td>0.8545</td><td>-</td><td>10875 B</td>
29+
</tr><tr><td>Marshall_Source_Generated</td><td>577.9 ns</td><td>46.28 ns</td><td>136.46 ns</td><td>484.8 ns</td><td>0.2375</td><td>0.0019</td><td>2984 B</td>
30+
</tr><tr><td>Unmarshall_AWS_Reflection</td><td>5,612.6 ns</td><td>60.79 ns</td><td>56.87 ns</td><td>5,625.0 ns</td><td>0.8545</td><td>-</td><td>10922 B</td>
31+
</tr><tr><td>Unmarshall_Source_Generated</td><td>870.1 ns</td><td>10.08 ns</td><td>8.93 ns</td><td>873.0 ns</td><td>0.0439</td><td>-</td><td>560 B</td>
32+
</tr></tbody></table>
33+
</body>
34+
</html>

tests/DynamoDBGenerator.SourceGenerator.Benchmarks/Models/PersonEntity.cs

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -6,8 +6,8 @@ namespace DynamoDBGenerator.SourceGenerator.Benchmarks.Models;
66
[DynamoDBMarshaller(EntityType = typeof(PersonEntity))]
77
public partial record PersonEntity
88
{
9-
public HashSet<string?>? StringSet { get; set; }
10-
public HashSet<int?>? IntSet { get; set; }
9+
public HashSet<string> StringSet { get; set; }
10+
public HashSet<int> IntSet { get; set; }
1111
[DynamoDBHashKey]
1212
public string Id { get; set; } = null!;
1313

0 commit comments

Comments
 (0)