Skip to content

Commit 2522426

Browse files
committed
Apply span usage
1 parent 7ae4ff8 commit 2522426

4 files changed

Lines changed: 29 additions & 20 deletions

File tree

src/DynamoDBGenerator/Internal/MarshallHelper.cs

Lines changed: 14 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -3,6 +3,7 @@
33
using System.Diagnostics.CodeAnalysis;
44
using System.Linq;
55
using System.Numerics;
6+
using System.Runtime.CompilerServices;
67
using System.Runtime.InteropServices;
78
using Amazon.DynamoDBv2.Model;
89

@@ -20,6 +21,7 @@ public static class MarshallHelper
2021
public static AttributeValue Null { get; } = new() { NULL = true };
2122

2223
[return: NotNullIfNotNull(nameof(dict))]
24+
[MethodImpl(MethodImplOptions.AggressiveInlining)]
2325
public static AttributeValue? ToAttributeValue(
2426
[NotNullIfNotNull(nameof(dict))] Dictionary<string, AttributeValue>? dict
2527
)
@@ -35,6 +37,7 @@ public static AttributeValue FromDictionary<T, TArgument>(
3537
string? dataMember,
3638
Func<T, TArgument, string?, AttributeValue> resultSelector)
3739
{
40+
// TODO lookover
3841
var elements = dictionary switch
3942
{
4043
IReadOnlyDictionary<string, T> a => new Dictionary<string, AttributeValue>(a.Count),
@@ -386,6 +389,7 @@ public static Dictionary<string, T> ToDictionary<T, TArgument>(
386389
{
387390
var elements = new Dictionary<string, T>(dictionary.Count);
388391

392+
// TODO look over
389393
foreach (var (key, value) in dictionary)
390394
elements[key] = resultSelector(value, argument, $"{dataMember}[{key}]");
391395

@@ -398,10 +402,13 @@ public static AttributeValue FromArray<T, TArgument>(
398402
string? dataMember,
399403
Func<T, TArgument, string?, AttributeValue> resultSelector)
400404
{
401-
var span = array.AsSpan();
402-
var attributeValues = new List<AttributeValue>(span.Length);
403-
for (var i = 0; i < span.Length; i++)
404-
attributeValues.Add(resultSelector(span[i], argument, $"{dataMember}[{i}]"));
405+
var fromSpan = array.AsSpan();
406+
var attributeValues = new List<AttributeValue>(fromSpan.Length);
407+
CollectionsMarshal.SetCount(attributeValues, fromSpan.Length);
408+
409+
var toSpan = CollectionsMarshal.AsSpan(attributeValues);
410+
for (var i = 0; i < fromSpan.Length; i++)
411+
toSpan[i] = resultSelector(fromSpan[i], argument, $"{dataMember}[{i}]");
405412

406413
return new AttributeValue { L = attributeValues };
407414
}
@@ -438,8 +445,10 @@ public static AttributeValue FromEnumerable<T, TArgument>(
438445
return new AttributeValue { L = [] };
439446

440447
var list = new List<AttributeValue>(count);
448+
CollectionsMarshal.SetCount(list, count);
449+
var span = CollectionsMarshal.AsSpan(list);
441450
foreach (var (element, i) in enumerable.Select((x, y) => (x, y)))
442-
list.Add(resultSelector(element, argument, $"{dataMember}[{i}]"));
451+
span[i] = resultSelector(element, argument, $"{dataMember}[{i}]");
443452

444453
return new AttributeValue { L = list };
445454
}

tests/DynamoDBGenerator.SourceGenerator.Benchmarks/BenchmarkDotNet.Artifacts/results/DynamoDBGenerator.SourceGenerator.Benchmarks.MarshallBenchmark-report-github.md

Lines changed: 6 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -9,9 +9,9 @@ Intel Core Ultra 9 185H, 1 CPU, 22 logical and 16 physical cores
99
Job=.NET 8.0 Runtime=.NET 8.0
1010
1111
```
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 |
12+
| Method | Mean | Error | StdDev | Median | Gen0 | Gen1 | Allocated |
13+
|---------------------------- |-----------:|----------:|----------:|-----------:|-------:|-------:|----------:|
14+
| Marshall_AWS_Reflection | 6,266.4 ns | 252.64 ns | 744.91 ns | 5,983.4 ns | 0.8545 | - | 10875 B |
15+
| Marshall_Source_Generated | 504.5 ns | 9.45 ns | 8.84 ns | 504.8 ns | 0.2375 | 0.0019 | 2984 B |
16+
| Unmarshall_AWS_Reflection | 5,756.4 ns | 114.93 ns | 188.83 ns | 5,725.5 ns | 0.8545 | - | 10922 B |
17+
| Unmarshall_Source_Generated | 875.8 ns | 12.42 ns | 11.62 ns | 879.6 ns | 0.0439 | - | 560 B |
Original file line numberDiff line numberDiff line change
@@ -1,5 +1,5 @@
11
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
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,"6,266.4 ns",252.64 ns,744.91 ns,"5,983.4 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,504.5 ns,9.45 ns,8.84 ns,504.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,756.4 ns",114.93 ns,188.83 ns,"5,725.5 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,875.8 ns,12.42 ns,11.62 ns,879.6 ns,0.0439,0.0000,560 B

tests/DynamoDBGenerator.SourceGenerator.Benchmarks/BenchmarkDotNet.Artifacts/results/DynamoDBGenerator.SourceGenerator.Benchmarks.MarshallBenchmark-report.html

Lines changed: 5 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -2,7 +2,7 @@
22
<html lang='en'>
33
<head>
44
<meta charset='utf-8' />
5-
<title>DynamoDBGenerator.SourceGenerator.Benchmarks.MarshallBenchmark-20250629-121942</title>
5+
<title>DynamoDBGenerator.SourceGenerator.Benchmarks.MarshallBenchmark-20250629-122837</title>
66

77
<style type="text/css">
88
table { border-collapse: collapse; display: block; width: 100%; overflow: auto; }
@@ -25,10 +25,10 @@
2525
<table>
2626
<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>
2727
</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>
28+
</thead><tbody><tr><td>Marshall_AWS_Reflection</td><td>6,266.4 ns</td><td>252.64 ns</td><td>744.91 ns</td><td>5,983.4 ns</td><td>0.8545</td><td>-</td><td>10875 B</td>
29+
</tr><tr><td>Marshall_Source_Generated</td><td>504.5 ns</td><td>9.45 ns</td><td>8.84 ns</td><td>504.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,756.4 ns</td><td>114.93 ns</td><td>188.83 ns</td><td>5,725.5 ns</td><td>0.8545</td><td>-</td><td>10922 B</td>
31+
</tr><tr><td>Unmarshall_Source_Generated</td><td>875.8 ns</td><td>12.42 ns</td><td>11.62 ns</td><td>879.6 ns</td><td>0.0439</td><td>-</td><td>560 B</td>
3232
</tr></tbody></table>
3333
</body>
3434
</html>

0 commit comments

Comments
 (0)