mirror of https://github.com/SixLabors/ImageSharp
6 changed files with 217 additions and 49 deletions
@ -0,0 +1,38 @@ |
|||
using BenchmarkDotNet.Attributes; |
|||
using SixLabors.ImageSharp.Formats.Jpeg.Components.Decoder.ColorConverters; |
|||
|
|||
namespace SixLabors.ImageSharp.Benchmarks.Codecs.Jpeg |
|||
{ |
|||
[Config(typeof(Config.ShortClr))] |
|||
public class CmykColorConversion : ColorConversionBenchmark |
|||
{ |
|||
public CmykColorConversion() |
|||
: base(4) |
|||
{ |
|||
} |
|||
|
|||
[Benchmark(Baseline = true)] |
|||
public void Scalar() |
|||
{ |
|||
var values = new JpegColorConverter.ComponentValues(this.input, 0); |
|||
|
|||
new JpegColorConverter.FromCmykBasic(8).ConvertToRgba(values, this.output); |
|||
} |
|||
|
|||
[Benchmark] |
|||
public void SimdVector8() |
|||
{ |
|||
var values = new JpegColorConverter.ComponentValues(this.input, 0); |
|||
|
|||
new JpegColorConverter.FromCmykVector8(8).ConvertToRgba(values, this.output); |
|||
} |
|||
|
|||
[Benchmark] |
|||
public void SimdVectorAvx2() |
|||
{ |
|||
var values = new JpegColorConverter.ComponentValues(this.input, 0); |
|||
|
|||
new JpegColorConverter.FromCmykAvx2(8).ConvertToRgba(values, this.output); |
|||
} |
|||
} |
|||
} |
|||
@ -0,0 +1,61 @@ |
|||
using System; |
|||
using System.Numerics; |
|||
using BenchmarkDotNet.Attributes; |
|||
using SixLabors.ImageSharp.Memory; |
|||
|
|||
namespace SixLabors.ImageSharp.Benchmarks.Codecs.Jpeg |
|||
{ |
|||
public abstract class ColorConversionBenchmark |
|||
{ |
|||
private readonly int componentCount; |
|||
protected Buffer2D<float>[] input; |
|||
protected Vector4[] output; |
|||
|
|||
protected ColorConversionBenchmark(int componentCount) |
|||
{ |
|||
this.componentCount = componentCount; |
|||
} |
|||
|
|||
public const int Count = 128; |
|||
|
|||
[GlobalSetup] |
|||
public void Setup() |
|||
{ |
|||
this.input = CreateRandomValues(componentCount, Count); |
|||
this.output = new Vector4[Count]; |
|||
} |
|||
|
|||
[GlobalCleanup] |
|||
public void Cleanup() |
|||
{ |
|||
foreach (Buffer2D<float> buffer in this.input) |
|||
{ |
|||
buffer.Dispose(); |
|||
} |
|||
} |
|||
|
|||
private static Buffer2D<float>[] CreateRandomValues( |
|||
int componentCount, |
|||
int inputBufferLength, |
|||
float minVal = 0f, |
|||
float maxVal = 255f) |
|||
{ |
|||
var rnd = new Random(42); |
|||
var buffers = new Buffer2D<float>[componentCount]; |
|||
for (int i = 0; i < componentCount; i++) |
|||
{ |
|||
var values = new float[inputBufferLength]; |
|||
|
|||
for (int j = 0; j < inputBufferLength; j++) |
|||
{ |
|||
values[j] = ((float)rnd.NextDouble() * (maxVal - minVal)) + minVal; |
|||
} |
|||
|
|||
// no need to dispose when buffer is not array owner
|
|||
buffers[i] = Configuration.Default.MemoryAllocator.Allocate2D<float>(values.Length, 1); |
|||
} |
|||
|
|||
return buffers; |
|||
} |
|||
} |
|||
} |
|||
@ -0,0 +1,38 @@ |
|||
using BenchmarkDotNet.Attributes; |
|||
using SixLabors.ImageSharp.Formats.Jpeg.Components.Decoder.ColorConverters; |
|||
|
|||
namespace SixLabors.ImageSharp.Benchmarks.Codecs.Jpeg |
|||
{ |
|||
[Config(typeof(Config.ShortClr))] |
|||
public class GrayscaleColorConversion : ColorConversionBenchmark |
|||
{ |
|||
public GrayscaleColorConversion() |
|||
: base(1) |
|||
{ |
|||
} |
|||
|
|||
[Benchmark(Baseline = true)] |
|||
public void Scalar() |
|||
{ |
|||
var values = new JpegColorConverter.ComponentValues(this.input, 0); |
|||
|
|||
new JpegColorConverter.FromGrayscaleBasic(8).ConvertToRgba(values, this.output); |
|||
} |
|||
|
|||
[Benchmark] |
|||
public void SimdVector8() |
|||
{ |
|||
var values = new JpegColorConverter.ComponentValues(this.input, 0); |
|||
|
|||
new JpegColorConverter.FromGrayscaleVector8(8).ConvertToRgba(values, this.output); |
|||
} |
|||
|
|||
[Benchmark] |
|||
public void SimdVectorAvx2() |
|||
{ |
|||
var values = new JpegColorConverter.ComponentValues(this.input, 0); |
|||
|
|||
new JpegColorConverter.FromGrayscaleAvx2(8).ConvertToRgba(values, this.output); |
|||
} |
|||
} |
|||
} |
|||
@ -0,0 +1,38 @@ |
|||
using BenchmarkDotNet.Attributes; |
|||
using SixLabors.ImageSharp.Formats.Jpeg.Components.Decoder.ColorConverters; |
|||
|
|||
namespace SixLabors.ImageSharp.Benchmarks.Codecs.Jpeg |
|||
{ |
|||
[Config(typeof(Config.ShortClr))] |
|||
public class RgbColorConversion : ColorConversionBenchmark |
|||
{ |
|||
public RgbColorConversion() |
|||
: base(3) |
|||
{ |
|||
} |
|||
|
|||
[Benchmark(Baseline = true)] |
|||
public void Scalar() |
|||
{ |
|||
var values = new JpegColorConverter.ComponentValues(this.input, 0); |
|||
|
|||
new JpegColorConverter.FromRgbBasic(8).ConvertToRgba(values, this.output); |
|||
} |
|||
|
|||
[Benchmark] |
|||
public void SimdVector8() |
|||
{ |
|||
var values = new JpegColorConverter.ComponentValues(this.input, 0); |
|||
|
|||
new JpegColorConverter.FromRgbVector8(8).ConvertToRgba(values, this.output); |
|||
} |
|||
|
|||
[Benchmark] |
|||
public void SimdVectorAvx2() |
|||
{ |
|||
var values = new JpegColorConverter.ComponentValues(this.input, 0); |
|||
|
|||
new JpegColorConverter.FromRgbAvx2(8).ConvertToRgba(values, this.output); |
|||
} |
|||
} |
|||
} |
|||
@ -0,0 +1,38 @@ |
|||
using BenchmarkDotNet.Attributes; |
|||
using SixLabors.ImageSharp.Formats.Jpeg.Components.Decoder.ColorConverters; |
|||
|
|||
namespace SixLabors.ImageSharp.Benchmarks.Codecs.Jpeg |
|||
{ |
|||
[Config(typeof(Config.ShortClr))] |
|||
public class YccKColorConverter : ColorConversionBenchmark |
|||
{ |
|||
public YccKColorConverter() |
|||
: base(4) |
|||
{ |
|||
} |
|||
|
|||
[Benchmark(Baseline = true)] |
|||
public void Scalar() |
|||
{ |
|||
var values = new JpegColorConverter.ComponentValues(this.input, 0); |
|||
|
|||
new JpegColorConverter.FromYccKBasic(8).ConvertToRgba(values, this.output); |
|||
} |
|||
|
|||
[Benchmark] |
|||
public void SimdVector8() |
|||
{ |
|||
var values = new JpegColorConverter.ComponentValues(this.input, 0); |
|||
|
|||
new JpegColorConverter.FromYccKVector8(8).ConvertToRgba(values, this.output); |
|||
} |
|||
|
|||
[Benchmark] |
|||
public void SimdVectorAvx2() |
|||
{ |
|||
var values = new JpegColorConverter.ComponentValues(this.input, 0); |
|||
|
|||
new JpegColorConverter.FromYccKAvx2(8).ConvertToRgba(values, this.output); |
|||
} |
|||
} |
|||
} |
|||
Loading…
Reference in new issue