@ -1,4 +1,5 @@
// ReSharper disable InconsistentNaming
// Copyright (c) Six Labors and contributors.
// Licensed under the Apache License, Version 2.0.
using System ;
using System.Runtime.CompilerServices ;
@ -9,6 +10,7 @@ using BenchmarkDotNet.Attributes;
using SixLabors.ImageSharp.PixelFormats ;
using SixLabors.ImageSharp.PixelFormats.Utils ;
// ReSharper disable InconsistentNaming
namespace SixLabors.ImageSharp.Benchmarks.General.PixelConversion
{
public abstract class PixelConversion_ConvertFromRgba32
@ -16,23 +18,23 @@ namespace SixLabors.ImageSharp.Benchmarks.General.PixelConversion
internal struct ConversionRunner < T >
where T : struct , ITestPixel < T >
{
public readonly T [ ] d est;
public readonly T [ ] D est;
public readonly Rgba32 [ ] s ource;
public readonly Rgba32 [ ] S ource;
public ConversionRunner ( int count )
{
this . d est = new T [ count ] ;
this . s ource = new Rgba32 [ count ] ;
this . D est = new T [ count ] ;
this . S ource = new Rgba32 [ count ] ;
}
[MethodImpl(MethodImplOptions.AggressiveInlining)]
public void RunByRefConversion ( )
{
int count = this . d est. Length ;
int count = this . D est. Length ;
ref T destBaseRef = ref this . d est[ 0 ] ;
ref Rgba32 sourceBaseRef = ref this . s ource[ 0 ] ;
ref T destBaseRef = ref this . D est[ 0 ] ;
ref Rgba32 sourceBaseRef = ref this . S ource[ 0 ] ;
for ( int i = 0 ; i < count ; i + + )
{
@ -43,10 +45,10 @@ namespace SixLabors.ImageSharp.Benchmarks.General.PixelConversion
[MethodImpl(MethodImplOptions.AggressiveInlining)]
public void RunByValConversion ( )
{
int count = this . d est. Length ;
int count = this . D est. Length ;
ref T destBaseRef = ref this . d est[ 0 ] ;
ref Rgba32 sourceBaseRef = ref this . s ource[ 0 ] ;
ref T destBaseRef = ref this . D est[ 0 ] ;
ref Rgba32 sourceBaseRef = ref this . S ource[ 0 ] ;
for ( int i = 0 ; i < count ; i + + )
{
@ -57,10 +59,10 @@ namespace SixLabors.ImageSharp.Benchmarks.General.PixelConversion
[MethodImpl(MethodImplOptions.AggressiveInlining)]
public void RunFromBytesConversion ( )
{
int count = this . d est. Length ;
int count = this . D est. Length ;
ref T destBaseRef = ref this . d est[ 0 ] ;
ref Rgba32 sourceBaseRef = ref this . s ource[ 0 ] ;
ref T destBaseRef = ref this . D est[ 0 ] ;
ref Rgba32 sourceBaseRef = ref this . S ource[ 0 ] ;
for ( int i = 0 ; i < count ; i + + )
{
@ -69,22 +71,19 @@ namespace SixLabors.ImageSharp.Benchmarks.General.PixelConversion
}
}
}
internal ConversionRunner < TestRgba > compatibleMemLayoutRunner ;
internal ConversionRunner < TestArgb > permutedRunnerRgbaToArgb ;
internal ConversionRunner < TestRgba > CompatibleMemLayoutRunner ;
[ Params (
2 5 6 ,
2 0 4 8
) ]
internal ConversionRunner < TestArgb > PermutedRunnerRgbaToArgb ;
[Params(256, 2048)]
public int Count { get ; set ; }
[GlobalSetup]
public void Setup ( )
{
this . c ompatibleMemLayoutRunner = new ConversionRunner < TestRgba > ( this . Count ) ;
this . p ermutedRunnerRgbaToArgb = new ConversionRunner < TestArgb > ( this . Count ) ;
this . C ompatibleMemLayoutRunner = new ConversionRunner < TestRgba > ( this . Count ) ;
this . P ermutedRunnerRgbaToArgb = new ConversionRunner < TestArgb > ( this . Count ) ;
}
}
@ -93,26 +92,26 @@ namespace SixLabors.ImageSharp.Benchmarks.General.PixelConversion
[Benchmark(Baseline = true)]
public void ByRef ( )
{
this . c ompatibleMemLayoutRunner. RunByRefConversion ( ) ;
this . C ompatibleMemLayoutRunner. RunByRefConversion ( ) ;
}
[Benchmark]
public void ByVal ( )
{
this . c ompatibleMemLayoutRunner. RunByValConversion ( ) ;
this . C ompatibleMemLayoutRunner. RunByValConversion ( ) ;
}
[Benchmark]
public void FromBytes ( )
{
this . c ompatibleMemLayoutRunner. RunFromBytesConversion ( ) ;
this . C ompatibleMemLayoutRunner. RunFromBytesConversion ( ) ;
}
[Benchmark]
public void Inline ( )
{
ref Rgba32 sBase = ref this . compatibleMemLayoutRunner . s ource[ 0 ] ;
ref Rgba32 dBase = ref Unsafe . As < TestRgba , Rgba32 > ( ref this . compatibleMemLayoutRunner . d est[ 0 ] ) ;
ref Rgba32 sBase = ref this . CompatibleMemLayoutRunner . S ource[ 0 ] ;
ref Rgba32 dBase = ref Unsafe . As < TestRgba , Rgba32 > ( ref this . CompatibleMemLayoutRunner . D est[ 0 ] ) ;
for ( int i = 0 ; i < this . Count ; i + + )
{
@ -120,12 +119,12 @@ namespace SixLabors.ImageSharp.Benchmarks.General.PixelConversion
}
}
// Method | Count | Mean | Error | StdDev | Scaled | ScaledSD |
// ---------- |------ |---------:|---------:|---------:|-------:|---------:|
// ByRef | 256 | 128.5 ns | 1.217 ns | 1.138 ns | 1.00 | 0.00 |
// ByVal | 256 | 196.7 ns | 2.792 ns | 2.612 ns | 1.53 | 0.02 |
// FromBytes | 256 | 321.7 ns | 2.180 ns | 1.820 ns | 2.50 | 0.03 |
// Inline | 256 | 129.9 ns | 2.759 ns | 2.581 ns | 1.01 | 0.02 |
/ * Method | Count | Mean | Error | StdDev | Scaled | ScaledSD |
- - - - - - - - - - | - - - - - - | - - - - - - - - - : | - - - - - - - - - : | - - - - - - - - - : | - - - - - - - : | - - - - - - - - - : |
ByRef | 2 5 6 | 1 2 8.5 ns | 1.217 ns | 1.138 ns | 1.00 | 0.00 |
ByVal | 2 5 6 | 1 9 6.7 ns | 2.792 ns | 2.612 ns | 1.53 | 0.02 |
FromBytes | 2 5 6 | 3 2 1.7 ns | 2.180 ns | 1.820 ns | 2.50 | 0.03 |
Inline | 2 5 6 | 1 2 9.9 ns | 2.759 ns | 2.581 ns | 1.01 | 0.02 | * /
}
public class PixelConversion_ConvertFromRgba32_Permuted_RgbaToArgb : PixelConversion_ConvertFromRgba32
@ -133,26 +132,26 @@ namespace SixLabors.ImageSharp.Benchmarks.General.PixelConversion
[Benchmark(Baseline = true)]
public void ByRef ( )
{
this . p ermutedRunnerRgbaToArgb. RunByRefConversion ( ) ;
this . P ermutedRunnerRgbaToArgb. RunByRefConversion ( ) ;
}
[Benchmark]
public void ByVal ( )
{
this . p ermutedRunnerRgbaToArgb. RunByValConversion ( ) ;
this . P ermutedRunnerRgbaToArgb. RunByValConversion ( ) ;
}
[Benchmark]
public void FromBytes ( )
{
this . p ermutedRunnerRgbaToArgb. RunFromBytesConversion ( ) ;
this . P ermutedRunnerRgbaToArgb. RunFromBytesConversion ( ) ;
}
[Benchmark]
public void InlineShuffle ( )
{
ref Rgba32 sBase = ref this . permutedRunnerRgbaToArgb . s ource[ 0 ] ;
ref TestArgb dBase = ref this . permutedRunnerRgbaToArgb . d est[ 0 ] ;
ref Rgba32 sBase = ref this . PermutedRunnerRgbaToArgb . S ource[ 0 ] ;
ref TestArgb dBase = ref this . PermutedRunnerRgbaToArgb . D est[ 0 ] ;
for ( int i = 0 ; i < this . Count ; i + + )
{
@ -169,8 +168,8 @@ namespace SixLabors.ImageSharp.Benchmarks.General.PixelConversion
[Benchmark]
public void PixelConverter_Rgba32_ToArgb32 ( )
{
ref uint sBase = ref Unsafe . As < Rgba32 , uint > ( ref this . permutedRunnerRgbaToArgb . s ource[ 0 ] ) ;
ref uint dBase = ref Unsafe . As < TestArgb , uint > ( ref this . permutedRunnerRgbaToArgb . d est[ 0 ] ) ;
ref uint sBase = ref Unsafe . As < Rgba32 , uint > ( ref this . PermutedRunnerRgbaToArgb . S ource[ 0 ] ) ;
ref uint dBase = ref Unsafe . As < TestArgb , uint > ( ref this . PermutedRunnerRgbaToArgb . D est[ 0 ] ) ;
for ( int i = 0 ; i < this . Count ; i + + )
{
@ -182,8 +181,8 @@ namespace SixLabors.ImageSharp.Benchmarks.General.PixelConversion
[Benchmark]
public void PixelConverter_Rgba32_ToArgb32_CopyThenWorkOnSingleBuffer ( )
{
Span < uint > source = MemoryMarshal . Cast < Rgba32 , uint > ( this . permutedRunnerRgbaToArgb . s ource) ;
Span < uint > dest = MemoryMarshal . Cast < TestArgb , uint > ( this . permutedRunnerRgbaToArgb . d est) ;
Span < uint > source = MemoryMarshal . Cast < Rgba32 , uint > ( this . PermutedRunnerRgbaToArgb . S ource) ;
Span < uint > dest = MemoryMarshal . Cast < TestArgb , uint > ( this . PermutedRunnerRgbaToArgb . D est) ;
source . CopyTo ( dest ) ;
ref uint dBase = ref MemoryMarshal . GetReference ( dest ) ;
@ -195,21 +194,23 @@ namespace SixLabors.ImageSharp.Benchmarks.General.PixelConversion
}
}
// RESULTS:
// Method | Count | Mean | Error | StdDev | Scaled | ScaledSD |
// ---------------------------------------------------------- |------ |-----------:|-----------:|-----------:|-------:|---------:|
// ByRef | 256 | 328.7 ns | 6.6141 ns | 6.1868 ns | 1.00 | 0.00 |
// ByVal | 256 | 322.0 ns | 4.3541 ns | 4.0728 ns | 0.98 | 0.02 |
// FromBytes | 256 | 321.5 ns | 3.3499 ns | 3.1335 ns | 0.98 | 0.02 |
// InlineShuffle | 256 | 330.7 ns | 4.2525 ns | 3.9778 ns | 1.01 | 0.02 |
// PixelConverter_Rgba32_ToArgb32 | 256 | 167.4 ns | 0.6357 ns | 0.5309 ns | 0.51 | 0.01 |
// PixelConverter_Rgba32_ToArgb32_CopyThenWorkOnSingleBuffer | 256 | 196.6 ns | 0.8929 ns | 0.7915 ns | 0.60 | 0.01 |
// | | | | | | |
// ByRef | 2048 | 2,534.4 ns | 8.2947 ns | 6.9265 ns | 1.00 | 0.00 |
// ByVal | 2048 | 2,638.5 ns | 52.6843 ns | 70.3320 ns | 1.04 | 0.03 |
// FromBytes | 2048 | 2,517.2 ns | 40.8055 ns | 38.1695 ns | 0.99 | 0.01 |
// InlineShuffle | 2048 | 2,546.5 ns | 21.2506 ns | 19.8778 ns | 1.00 | 0.01 |
// PixelConverter_Rgba32_ToArgb32 | 2048 | 1,265.7 ns | 5.1397 ns | 4.5562 ns | 0.50 | 0.00 |
// PixelConverter_Rgba32_ToArgb32_CopyThenWorkOnSingleBuffer | 2048 | 1,410.3 ns | 11.1939 ns | 9.9231 ns | 0.56 | 0.00 |//
/ *
RESULTS :
Method | Count | Mean | Error | StdDev | Scaled | ScaledSD |
- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - | - - - - - - | - - - - - - - - - - - : | - - - - - - - - - - - : | - - - - - - - - - - - : | - - - - - - - : | - - - - - - - - - : |
ByRef | 2 5 6 | 3 2 8.7 ns | 6.6141 ns | 6.1868 ns | 1.00 | 0.00 |
ByVal | 2 5 6 | 3 2 2.0 ns | 4.3541 ns | 4.0728 ns | 0.98 | 0.02 |
FromBytes | 2 5 6 | 3 2 1.5 ns | 3.3499 ns | 3.1335 ns | 0.98 | 0.02 |
InlineShuffle | 2 5 6 | 3 3 0.7 ns | 4.2525 ns | 3.9778 ns | 1.01 | 0.02 |
PixelConverter_Rgba32_ToArgb32 | 2 5 6 | 1 6 7.4 ns | 0.6357 ns | 0.5309 ns | 0.51 | 0.01 |
PixelConverter_Rgba32_ToArgb32_CopyThenWorkOnSingleBuffer | 2 5 6 | 1 9 6.6 ns | 0.8929 ns | 0.7915 ns | 0.60 | 0.01 |
| | | | | | |
ByRef | 2 0 4 8 | 2 , 5 3 4.4 ns | 8.2947 ns | 6.9265 ns | 1.00 | 0.00 |
ByVal | 2 0 4 8 | 2 , 6 3 8.5 ns | 5 2.6843 ns | 7 0.3320 ns | 1.04 | 0.03 |
FromBytes | 2 0 4 8 | 2 , 5 1 7.2 ns | 4 0.8055 ns | 3 8.1695 ns | 0.99 | 0.01 |
InlineShuffle | 2 0 4 8 | 2 , 5 4 6.5 ns | 2 1.2506 ns | 1 9.8778 ns | 1.00 | 0.01 |
PixelConverter_Rgba32_ToArgb32 | 2 0 4 8 | 1 , 2 6 5.7 ns | 5.1397 ns | 4.5562 ns | 0.50 | 0.00 |
PixelConverter_Rgba32_ToArgb32_CopyThenWorkOnSingleBuffer | 2 0 4 8 | 1 , 4 1 0.3 ns | 1 1.1939 ns | 9.9231 ns | 0.56 | 0.00 |
* /
}
}
}