diff --git a/tests/ImageSharp.Benchmarks/Color/Bulk/PackFromVector4ReferenceVsPointer.cs b/tests/ImageSharp.Benchmarks/Color/Bulk/PackFromVector4ReferenceVsPointer.cs
new file mode 100644
index 000000000..e912ea29f
--- /dev/null
+++ b/tests/ImageSharp.Benchmarks/Color/Bulk/PackFromVector4ReferenceVsPointer.cs
@@ -0,0 +1,74 @@
+namespace ImageSharp.Benchmarks
+{
+ using System.Numerics;
+ using System.Runtime.CompilerServices;
+
+ using BenchmarkDotNet.Attributes;
+
+ using ImageSharp;
+
+ ///
+ /// Compares two implementation candidates for general BulkPixelOperations.ToVector4():
+ /// - One iterating with pointers
+ /// - One iterating with ref locals
+ ///
+ public unsafe class PackFromVector4ReferenceVsPointer
+ {
+ private PinnedBuffer destination;
+
+ private PinnedBuffer source;
+
+ [Params(16, 128, 1024)]
+ public int Count { get; set; }
+
+ [Setup]
+ public void Setup()
+ {
+ this.destination = new PinnedBuffer(this.Count);
+ this.source = new PinnedBuffer(this.Count * 4);
+ }
+
+ [Cleanup]
+ public void Cleanup()
+ {
+ this.source.Dispose();
+ this.destination.Dispose();
+ }
+
+ [Benchmark(Baseline = true)]
+ public void PackUsingPointers()
+ {
+ Vector4* sp = (Vector4*)this.source.Pointer;
+ byte* dp = (byte*)this.destination.Pointer;
+ int count = this.Count;
+ int size = sizeof(ImageSharp.Color);
+
+ for (int i = 0; i < count; i++)
+ {
+ Vector4 v = Unsafe.Read(sp);
+ ImageSharp.Color c = default(ImageSharp.Color);
+ c.PackFromVector4(v);
+ Unsafe.Write(dp, c);
+
+ sp++;
+ dp += size;
+ }
+ }
+
+ [Benchmark]
+ public void PackUsingReferences()
+ {
+ ref Vector4 sp = ref this.source.Array[0];
+ ref ImageSharp.Color dp = ref this.destination.Array[0];
+ int count = this.Count;
+
+ for (int i = 0; i < count; i++)
+ {
+ dp.PackFromVector4(sp);
+
+ sp = Unsafe.Add(ref sp, 1);
+ dp = Unsafe.Add(ref dp, 1);
+ }
+ }
+ }
+}
\ No newline at end of file