Skip to content

Commit 9e19134

Browse files
Implement feedback and update benchmarks
1 parent 189c07b commit 9e19134

File tree

3 files changed

+31
-4
lines changed

3 files changed

+31
-4
lines changed

src/ImageSharp/Common/Helpers/Numerics.cs

Lines changed: 4 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -474,8 +474,10 @@ private static void ClampImpl<T>(Span<T> span, T min, T max)
474474
[MethodImpl(MethodImplOptions.AggressiveInlining)]
475475
public static void Premultiply(ref Vector4 source)
476476
{
477-
Vector4 alpha = PermuteW(source);
478-
source = WithW(source * alpha, alpha);
477+
// Load into a local variable to prevent accessing the source from memory multiple times.
478+
Vector4 src = source;
479+
Vector4 alpha = PermuteW(src);
480+
source = WithW(src * alpha, alpha);
479481
}
480482

481483
/// <summary>

tests/ImageSharp.Benchmarks/Color/Bulk/PremultiplyVector4.cs

Lines changed: 13 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -25,7 +25,19 @@ public void PremultiplyBaseline()
2525
}
2626

2727
[Benchmark]
28-
public void Premultiply() => Numerics.Premultiply(Vectors);
28+
public void Premultiply()
29+
{
30+
ref Vector4 baseRef = ref MemoryMarshal.GetReference<Vector4>(Vectors);
31+
32+
for (int i = 0; i < Vectors.Length; i++)
33+
{
34+
ref Vector4 v = ref Unsafe.Add(ref baseRef, i);
35+
Numerics.Premultiply(ref v);
36+
}
37+
}
38+
39+
[Benchmark]
40+
public void PremultiplyBulk() => Numerics.Premultiply(Vectors);
2941

3042
[MethodImpl(InliningOptions.ShortMethod)]
3143
private static void Premultiply(ref Vector4 source)

tests/ImageSharp.Benchmarks/Color/Bulk/UnPremultiplyVector4.cs

Lines changed: 14 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -20,12 +20,25 @@ public void UnPremultiplyBaseline()
2020
for (int i = 0; i < Vectors.Length; i++)
2121
{
2222
ref Vector4 v = ref Unsafe.Add(ref baseRef, i);
23+
2324
UnPremultiply(ref v);
2425
}
2526
}
2627

2728
[Benchmark]
28-
public void UnPremultiply() => Numerics.UnPremultiply(Vectors);
29+
public void UnPremultiply()
30+
{
31+
ref Vector4 baseRef = ref MemoryMarshal.GetReference<Vector4>(Vectors);
32+
33+
for (int i = 0; i < Vectors.Length; i++)
34+
{
35+
ref Vector4 v = ref Unsafe.Add(ref baseRef, i);
36+
Numerics.UnPremultiply(ref v);
37+
}
38+
}
39+
40+
[Benchmark]
41+
public void UnPremultiplyBulk() => Numerics.UnPremultiply(Vectors);
2942

3043
[MethodImpl(InliningOptions.ShortMethod)]
3144
private static void UnPremultiply(ref Vector4 source)

0 commit comments

Comments
 (0)