Browse Source

Fix stylecop warnings in the test project

pull/1090/head
Brian Popow 6 years ago
parent
commit
43cbdab113
  1. 3
      Directory.Build.props
  2. 3
      src/Directory.Build.props
  3. 28
      src/ImageSharp/Metadata/Profiles/ICC/DataReader/IccDataReader.TagDataEntry.cs
  4. 2
      src/ImageSharp/Metadata/Profiles/ICC/TagDataEntries/IccLutAToBTagDataEntry.cs
  5. 2
      src/ImageSharp/Metadata/Profiles/ICC/TagDataEntries/IccLutBToATagDataEntry.cs
  6. 23
      tests/ImageSharp.Benchmarks/Codecs/DecodeTga.cs
  7. 16
      tests/ImageSharp.Benchmarks/Codecs/EncodeBmpMultiple.cs
  8. 13
      tests/ImageSharp.Benchmarks/Codecs/EncodeGifMultiple.cs
  9. 2
      tests/ImageSharp.Benchmarks/Codecs/EncodeTga.cs
  10. 5
      tests/ImageSharp.Benchmarks/Codecs/ImageBenchmarkTests.cs
  11. 6
      tests/ImageSharp.Benchmarks/Codecs/Jpeg/BlockOperations/Block8x8F_CopyTo1x1.cs
  12. 7
      tests/ImageSharp.Benchmarks/Codecs/Jpeg/BlockOperations/Block8x8F_CopyTo2x2.cs
  13. 19
      tests/ImageSharp.Benchmarks/Codecs/Jpeg/BlockOperations/Block8x8F_DivideRound.cs
  14. 7
      tests/ImageSharp.Benchmarks/Codecs/Jpeg/BlockOperations/Block8x8F_LoadFromInt16.cs
  15. 3
      tests/ImageSharp.Benchmarks/Codecs/Jpeg/BlockOperations/Block8x8F_Round.cs
  16. 3
      tests/ImageSharp.Benchmarks/Codecs/Jpeg/DecodeJpegParseStreamOnly.cs
  17. 6
      tests/ImageSharp.Benchmarks/Codecs/Jpeg/DecodeJpeg_Aggregate.cs
  18. 51
      tests/ImageSharp.Benchmarks/Codecs/Jpeg/DecodeJpeg_ImageSpecific.cs
  19. 49
      tests/ImageSharp.Benchmarks/Codecs/Jpeg/DoubleBufferedStreams.cs
  20. 9
      tests/ImageSharp.Benchmarks/Codecs/Jpeg/EncodeJpeg.cs
  21. 16
      tests/ImageSharp.Benchmarks/Codecs/Jpeg/EncodeJpegMultiple.cs
  22. 6
      tests/ImageSharp.Benchmarks/Codecs/Jpeg/LoadResizeSave_Aggregate.cs
  23. 22
      tests/ImageSharp.Benchmarks/Codecs/Jpeg/LoadResizeSave_ImageSpecific.cs
  24. 2
      tests/ImageSharp.Benchmarks/Codecs/Jpeg/YCbCrColorConversion.cs
  25. 55
      tests/ImageSharp.Benchmarks/Codecs/MultiImageBenchmarkBase.cs
  26. 14
      tests/ImageSharp.Benchmarks/Color/Bulk/FromRgba32Bytes.cs
  27. 13
      tests/ImageSharp.Benchmarks/Color/Bulk/FromVector4.cs
  28. 5
      tests/ImageSharp.Benchmarks/Color/Bulk/Rgb24Bytes.cs
  29. 5
      tests/ImageSharp.Benchmarks/Color/Bulk/ToRgba32Bytes.cs
  30. 18
      tests/ImageSharp.Benchmarks/Color/Bulk/ToVector4.cs
  31. 5
      tests/ImageSharp.Benchmarks/Color/Bulk/ToVector4_Bgra32.cs
  32. 68
      tests/ImageSharp.Benchmarks/Color/Bulk/ToVector4_Rgba32.cs
  33. 8
      tests/ImageSharp.Benchmarks/Color/ColorspaceCieXyzToCieLabConvert.cs
  34. 7
      tests/ImageSharp.Benchmarks/Color/ColorspaceCieXyzToHunterLabConvert.cs
  35. 5
      tests/ImageSharp.Benchmarks/Color/ColorspaceCieXyzToLmsConvert.cs
  36. 10
      tests/ImageSharp.Benchmarks/Color/ColorspaceCieXyzToRgbConvert.cs
  37. 7
      tests/ImageSharp.Benchmarks/Color/RgbToYCbCr.LookupTables.cs
  38. 11
      tests/ImageSharp.Benchmarks/Color/RgbToYCbCr.cs
  39. 5
      tests/ImageSharp.Benchmarks/Color/RgbWorkingSpaceAdapt.cs
  40. 5
      tests/ImageSharp.Benchmarks/Color/YcbCrToRgb.cs
  41. 3
      tests/ImageSharp.Benchmarks/Config.cs
  42. 16
      tests/ImageSharp.Benchmarks/General/Array2D.cs
  43. 21
      tests/ImageSharp.Benchmarks/General/ArrayReverse.cs
  44. 5
      tests/ImageSharp.Benchmarks/General/BasicMath/Abs.cs
  45. 8
      tests/ImageSharp.Benchmarks/General/BasicMath/ClampFloat.cs
  46. 7
      tests/ImageSharp.Benchmarks/General/BasicMath/ModuloPowerOfTwoConstant.cs
  47. 7
      tests/ImageSharp.Benchmarks/General/BasicMath/ModuloPowerOfTwoVariable.cs
  48. 6
      tests/ImageSharp.Benchmarks/General/BasicMath/Pow.cs
  49. 11
      tests/ImageSharp.Benchmarks/General/BasicMath/Round.cs
  50. 2
      tests/ImageSharp.Benchmarks/General/CopyBuffers.cs
  51. 9
      tests/ImageSharp.Benchmarks/General/PixelConversion/ITestPixel.cs
  52. 121
      tests/ImageSharp.Benchmarks/General/PixelConversion/PixelConversion_ConvertFromRgba32.cs
  53. 19
      tests/ImageSharp.Benchmarks/General/PixelConversion/PixelConversion_ConvertFromVector4.cs
  54. 13
      tests/ImageSharp.Benchmarks/General/PixelConversion/PixelConversion_ConvertToRgba32.cs
  55. 9
      tests/ImageSharp.Benchmarks/General/PixelConversion/PixelConversion_ConvertToRgba32_AsPartOfCompositeOperation.cs
  56. 9
      tests/ImageSharp.Benchmarks/General/PixelConversion/PixelConversion_ConvertToVector4.cs
  57. 9
      tests/ImageSharp.Benchmarks/General/PixelConversion/PixelConversion_ConvertToVector4_AsPartOfCompositeOperation.cs
  58. 12
      tests/ImageSharp.Benchmarks/General/PixelConversion/PixelConversion_Rgba32_To_Argb32.cs
  59. 84
      tests/ImageSharp.Benchmarks/General/PixelConversion/PixelConversion_Rgba32_To_Bgra32.cs
  60. 14
      tests/ImageSharp.Benchmarks/General/PixelConversion/TestArgb.cs
  61. 16
      tests/ImageSharp.Benchmarks/General/PixelConversion/TestRgba.cs
  62. 5
      tests/ImageSharp.Benchmarks/General/StructCasting.cs
  63. 22
      tests/ImageSharp.Benchmarks/General/Vector4Constants.cs
  64. 7
      tests/ImageSharp.Benchmarks/General/Vectorization/BitwiseOrUint32.cs
  65. 5
      tests/ImageSharp.Benchmarks/General/Vectorization/DivFloat.cs
  66. 5
      tests/ImageSharp.Benchmarks/General/Vectorization/DivUInt32.cs
  67. 9
      tests/ImageSharp.Benchmarks/General/Vectorization/Divide.cs
  68. 3
      tests/ImageSharp.Benchmarks/General/Vectorization/MulFloat.cs
  69. 3
      tests/ImageSharp.Benchmarks/General/Vectorization/MulUInt32.cs
  70. 7
      tests/ImageSharp.Benchmarks/General/Vectorization/Multiply.cs
  71. 7
      tests/ImageSharp.Benchmarks/General/Vectorization/Premultiply.cs
  72. 17
      tests/ImageSharp.Benchmarks/General/Vectorization/ReinterpretUInt32AsFloat.cs
  73. 7
      tests/ImageSharp.Benchmarks/General/Vectorization/SIMDBenchmarkBase.cs
  74. 10
      tests/ImageSharp.Benchmarks/General/Vectorization/UInt32ToSingle.cs
  75. 7
      tests/ImageSharp.Benchmarks/General/Vectorization/VectorFetching.cs
  76. 7
      tests/ImageSharp.Benchmarks/General/Vectorization/WidenBytesToUInt32.cs
  77. 10
      tests/ImageSharp.Benchmarks/Samplers/Crop.cs
  78. 7
      tests/ImageSharp.Benchmarks/Samplers/DetectEdges.cs
  79. 11
      tests/ImageSharp.Benchmarks/Samplers/Diffuse.cs
  80. 3
      tests/ImageSharp.Benchmarks/Samplers/GaussianBlur.cs
  81. 39
      tests/ImageSharp.Benchmarks/Samplers/Resize.cs
  82. 48
      tests/ImageSharp.Benchmarks/Samplers/Rotate.cs
  83. 48
      tests/ImageSharp.Benchmarks/Samplers/Skew.cs
  84. 4
      tests/ImageSharp.Sandbox46/ImageSharp.Sandbox46.csproj
  85. 4
      tests/ImageSharp.Sandbox46/Program.cs
  86. 15
      tests/ImageSharp.Tests/Advanced/AdvancedImageExtensionsTests.cs
  87. 4
      tests/ImageSharp.Tests/Color/ColorTests.CastTo.cs
  88. 12
      tests/ImageSharp.Tests/Color/ColorTests.cs
  89. 6
      tests/ImageSharp.Tests/Color/ReferencePalette.cs
  90. 10
      tests/ImageSharp.Tests/Colorspaces/CieLabTests.cs
  91. 10
      tests/ImageSharp.Tests/Colorspaces/CieXyChromaticityCoordinatesTests.cs
  92. 10
      tests/ImageSharp.Tests/Colorspaces/Conversion/ApproximateColorspaceComparer.cs
  93. 5
      tests/ImageSharp.Tests/Colorspaces/Conversion/CieLchAndCieXyyConversionTests.cs
  94. 5
      tests/ImageSharp.Tests/Colorspaces/Conversion/CieLchuvAndCieLuvConversionTests.cs
  95. 5
      tests/ImageSharp.Tests/Colorspaces/Conversion/CieLuvAndCieXyyConversionTests.cs
  96. 5
      tests/ImageSharp.Tests/Colorspaces/Conversion/CieLuvAndHslConversionTests.cs
  97. 5
      tests/ImageSharp.Tests/Colorspaces/Conversion/CieLuvAndHsvConversionTests.cs
  98. 5
      tests/ImageSharp.Tests/Colorspaces/Conversion/CieLuvAndHunterLabConversionTests.cs
  99. 5
      tests/ImageSharp.Tests/Colorspaces/Conversion/CieLuvAndLinearRgbConversionTests.cs
  100. 5
      tests/ImageSharp.Tests/Colorspaces/Conversion/CieLuvAndLmsConversionTests.cs

3
Directory.Build.props

@ -102,8 +102,7 @@
<ItemGroup>
<PackageReference Include="Microsoft.Net.Compilers.Toolset" IsImplicitlyDefined="true" />
<PackageReference Include="Microsoft.NETFramework.ReferenceAssemblies" IsImplicitlyDefined="true" />
<!--TODO: Enable this once tests Stylecop issues are fixed-->
<!--<PackageReference Include="StyleCop.Analyzers" IsImplicitlyDefined="true" />-->
<PackageReference Include="StyleCop.Analyzers" IsImplicitlyDefined="true" />
<AdditionalFiles Include="$(MSBuildThisFileDirectory)shared-infrastructure\stylecop.json" />
<!--NuGet package icon source-->
<None Include="$(MSBuildThisFileDirectory)shared-infrastructure\branding\icons\imagesharp\sixlabors.imagesharp.128.png" Pack="true" PackagePath="\icon.png" />

3
src/Directory.Build.props

@ -27,9 +27,6 @@
</PropertyGroup>
<ItemGroup>
<!--TODO: Delete this once tests Stylecop issues are fixed-->
<PackageReference Include="StyleCop.Analyzers" IsImplicitlyDefined="true" />
<InternalsVisibleTo Include="DynamicProxyGenAssembly2" PublicKey="0024000004800000940000000602000000240000525341310004000001000100c547cac37abd99c8db225ef2f6c8a3602f3b3606cc9891605d02baa56104f4cfc0734aa39b93bf7852f7d9266654753cc297e7d2edfe0bac1cdcf9f717241550e0a7b191195b7667bb4f64bcb8e2121380fd1d9d46ad2d92d2d15605093924cceaf74c4861eff62abf69b9291ed0a340e113be11e6a7d3113e92484cf7045cc7" />
<InternalsVisibleTo Include="DynamicProxyGenAssembly2, PublicKeyToken=null" />
<InternalsVisibleTo Include="ImageSharp.Benchmarks" />

28
src/ImageSharp/Metadata/Profiles/ICC/DataReader/IccDataReader.TagDataEntry.cs

@ -153,7 +153,7 @@ namespace SixLabors.ImageSharp.Metadata.Profiles.Icc
else
{
// The type is not know, so the values need be read
var values = new double[channelCount][];
double[][] values = new double[channelCount][];
for (int i = 0; i < channelCount; i++)
{
values[i] = new double[] { this.ReadUFix16(), this.ReadUFix16() };
@ -208,7 +208,7 @@ namespace SixLabors.ImageSharp.Metadata.Profiles.Icc
return new IccCurveTagDataEntry(this.ReadUFix8());
}
var cdata = new float[pointCount];
float[] cdata = new float[pointCount];
for (int i = 0; i < pointCount; i++)
{
cdata[i] = this.ReadUInt16() / 65535f;
@ -264,7 +264,7 @@ namespace SixLabors.ImageSharp.Metadata.Profiles.Icc
// Input LUT
var inValues = new IccLut[inChCount];
var gridPointCount = new byte[inChCount];
byte[] gridPointCount = new byte[inChCount];
for (int i = 0; i < inChCount; i++)
{
inValues[i] = this.ReadLut16(inTableCount);
@ -299,7 +299,7 @@ namespace SixLabors.ImageSharp.Metadata.Profiles.Icc
// Input LUT
var inValues = new IccLut[inChCount];
var gridPointCount = new byte[inChCount];
byte[] gridPointCount = new byte[inChCount];
for (int i = 0; i < inChCount; i++)
{
inValues[i] = this.ReadLut8();
@ -464,8 +464,8 @@ namespace SixLabors.ImageSharp.Metadata.Profiles.Icc
var text = new IccLocalizedString[recordCount];
var culture = new CultureInfo[recordCount];
var length = new uint[recordCount];
var offset = new uint[recordCount];
uint[] length = new uint[recordCount];
uint[] offset = new uint[recordCount];
for (int i = 0; i < recordCount; i++)
{
@ -627,7 +627,7 @@ namespace SixLabors.ImageSharp.Metadata.Profiles.Icc
ushort channelCount = this.ReadUInt16();
ushort measurementCount = this.ReadUInt16();
var offset = new uint[measurementCount];
uint[] offset = new uint[measurementCount];
for (int i = 0; i < measurementCount; i++)
{
offset[i] = this.ReadUInt32();
@ -651,7 +651,7 @@ namespace SixLabors.ImageSharp.Metadata.Profiles.Icc
public IccFix16ArrayTagDataEntry ReadFix16ArrayTagDataEntry(uint size)
{
uint count = (size - 8) / 4;
var arrayData = new float[count];
float[] arrayData = new float[count];
for (int i = 0; i < count; i++)
{
arrayData[i] = this.ReadFix16() / 256f;
@ -687,7 +687,7 @@ namespace SixLabors.ImageSharp.Metadata.Profiles.Icc
public IccUFix16ArrayTagDataEntry ReadUFix16ArrayTagDataEntry(uint size)
{
uint count = (size - 8) / 4;
var arrayData = new float[count];
float[] arrayData = new float[count];
for (int i = 0; i < count; i++)
{
arrayData[i] = this.ReadUFix16();
@ -704,7 +704,7 @@ namespace SixLabors.ImageSharp.Metadata.Profiles.Icc
public IccUInt16ArrayTagDataEntry ReadUInt16ArrayTagDataEntry(uint size)
{
uint count = (size - 8) / 2;
var arrayData = new ushort[count];
ushort[] arrayData = new ushort[count];
for (int i = 0; i < count; i++)
{
arrayData[i] = this.ReadUInt16();
@ -721,7 +721,7 @@ namespace SixLabors.ImageSharp.Metadata.Profiles.Icc
public IccUInt32ArrayTagDataEntry ReadUInt32ArrayTagDataEntry(uint size)
{
uint count = (size - 8) / 4;
var arrayData = new uint[count];
uint[] arrayData = new uint[count];
for (int i = 0; i < count; i++)
{
arrayData[i] = this.ReadUInt32();
@ -738,7 +738,7 @@ namespace SixLabors.ImageSharp.Metadata.Profiles.Icc
public IccUInt64ArrayTagDataEntry ReadUInt64ArrayTagDataEntry(uint size)
{
uint count = (size - 8) / 8;
var arrayData = new ulong[count];
ulong[] arrayData = new ulong[count];
for (int i = 0; i < count; i++)
{
arrayData[i] = this.ReadUInt64();
@ -878,14 +878,14 @@ namespace SixLabors.ImageSharp.Metadata.Profiles.Icc
public IccUcrBgTagDataEntry ReadUcrBgTagDataEntry(uint size)
{
uint ucrCount = this.ReadUInt32();
var ucrCurve = new ushort[ucrCount];
ushort[] ucrCurve = new ushort[ucrCount];
for (int i = 0; i < ucrCurve.Length; i++)
{
ucrCurve[i] = this.ReadUInt16();
}
uint bgCount = this.ReadUInt32();
var bgCurve = new ushort[bgCount];
ushort[] bgCurve = new ushort[bgCount];
for (int i = 0; i < bgCurve.Length; i++)
{
bgCurve[i] = this.ReadUInt16();

2
src/ImageSharp/Metadata/Profiles/ICC/TagDataEntries/IccLutAToBTagDataEntry.cs

@ -1,4 +1,4 @@
// Copyright (c) Six Labors and contributors.
// Copyright (c) Six Labors and contributors.
// Licensed under the Apache License, Version 2.0.
using System;

2
src/ImageSharp/Metadata/Profiles/ICC/TagDataEntries/IccLutBToATagDataEntry.cs

@ -1,4 +1,4 @@
// Copyright (c) Six Labors and contributors.
// Copyright (c) Six Labors and contributors.
// Licensed under the Apache License, Version 2.0.
using System;

23
tests/ImageSharp.Benchmarks/Codecs/DecodeTga.cs

@ -18,7 +18,9 @@ namespace SixLabors.ImageSharp.Benchmarks.Codecs
public class DecodeTga : BenchmarkBase
{
private string TestImageFullPath => Path.Combine(TestEnvironment.InputImagesDirectoryFullPath, this.TestImage);
private readonly PfimConfig pfimConfig = new PfimConfig(allocator: new PfimAllocator());
private byte[] data;
[Params(TestImages.Tga.Bit24)]
@ -77,15 +79,16 @@ namespace SixLabors.ImageSharp.Benchmarks.Codecs
public int Rented => this.rented;
}
// RESULTS (07/01/2020)
//| Method | Runtime | TestImage | Mean | Error | StdDev | Ratio | Gen 0 | Gen 1 | Gen 2 | Allocated |
//|------------------ |-------------- |-------------------- |-------------:|-------------:|-----------:|------:|-------:|------:|------:|----------:|
//| 'ImageMagick Tga' | .NET 4.7.2 | Tga/targa_24bit.tga | 1,778.965 us | 1,711.088 us | 93.7905 us | 1.000 | 1.9531 | - | - | 13668 B |
//| 'ImageSharp Tga' | .NET 4.7.2 | Tga/targa_24bit.tga | 38.659 us | 6.886 us | 0.3774 us | 0.022 | 0.3052 | - | - | 1316 B |
//| 'Pfim Tga' | .NET 4.7.2 | Tga/targa_24bit.tga | 6.752 us | 10.268 us | 0.5628 us | 0.004 | 0.0687 | - | - | 313 B |
//| | | | | | | | | | | |
//| 'ImageMagick Tga' | .NET Core 2.1 | Tga/targa_24bit.tga | 1,407.585 us | 124.215 us | 6.8087 us | 1.000 | 1.9531 | - | - | 13307 B |
//| 'ImageSharp Tga' | .NET Core 2.1 | Tga/targa_24bit.tga | 17.958 us | 9.352 us | 0.5126 us | 0.013 | 0.2747 | - | - | 1256 B |
//| 'Pfim Tga' | .NET Core 2.1 | Tga/targa_24bit.tga | 5.645 us | 2.279 us | 0.1249 us | 0.004 | 0.0610 | - | - | 280 B |
/* RESULTS (07/01/2020)
| Method | Runtime | TestImage | Mean | Error | StdDev | Ratio | Gen 0 | Gen 1 | Gen 2 | Allocated |
|------------------ |-------------- |-------------------- |-------------:|-------------:|-----------:|------:|-------:|------:|------:|----------:|
| 'ImageMagick Tga' | .NET 4.7.2 | Tga/targa_24bit.tga | 1,778.965 us | 1,711.088 us | 93.7905 us | 1.000 | 1.9531 | - | - | 13668 B |
| 'ImageSharp Tga' | .NET 4.7.2 | Tga/targa_24bit.tga | 38.659 us | 6.886 us | 0.3774 us | 0.022 | 0.3052 | - | - | 1316 B |
| 'Pfim Tga' | .NET 4.7.2 | Tga/targa_24bit.tga | 6.752 us | 10.268 us | 0.5628 us | 0.004 | 0.0687 | - | - | 313 B |
| | | | | | | | | | | |
| 'ImageMagick Tga' | .NET Core 2.1 | Tga/targa_24bit.tga | 1,407.585 us | 124.215 us | 6.8087 us | 1.000 | 1.9531 | - | - | 13307 B |
| 'ImageSharp Tga' | .NET Core 2.1 | Tga/targa_24bit.tga | 17.958 us | 9.352 us | 0.5126 us | 0.013 | 0.2747 | - | - | 1256 B |
| 'Pfim Tga' | .NET Core 2.1 | Tga/targa_24bit.tga | 5.645 us | 2.279 us | 0.1249 us | 0.004 | 0.0610 | - | - | 280 B |
*/
}
}

16
tests/ImageSharp.Benchmarks/Codecs/EncodeBmpMultiple.cs

@ -1,4 +1,4 @@
// Copyright (c) Six Labors and contributors.
// Copyright (c) Six Labors and contributors.
// Licensed under the Apache License, Version 2.0.
using System.Collections.Generic;
@ -16,13 +16,21 @@ namespace SixLabors.ImageSharp.Benchmarks.Codecs
[Benchmark(Description = "EncodeBmpMultiple - ImageSharp")]
public void EncodeBmpImageSharp()
{
this.ForEachImageSharpImage((img, ms) => { img.Save(ms, new BmpEncoder()); return null; });
this.ForEachImageSharpImage((img, ms) =>
{
img.Save(ms, new BmpEncoder());
return null;
});
}
[Benchmark(Baseline = true, Description = "EncodeBmpMultiple - System.Drawing")]
public void EncodeBmpSystemDrawing()
{
this.ForEachSystemDrawingImage((img, ms) => { img.Save(ms, ImageFormat.Bmp); return null; });
this.ForEachSystemDrawingImage((img, ms) =>
{
img.Save(ms, ImageFormat.Bmp);
return null;
});
}
}
}
}

13
tests/ImageSharp.Benchmarks/Codecs/EncodeGifMultiple.cs

@ -1,4 +1,4 @@
// Copyright (c) Six Labors and contributors.
// Copyright (c) Six Labors and contributors.
// Licensed under the Apache License, Version 2.0.
using System.Collections.Generic;
@ -24,14 +24,19 @@ namespace SixLabors.ImageSharp.Benchmarks.Codecs
{
// Try to get as close to System.Drawing's output as possible
var options = new GifEncoder { Quantizer = new WebSafePaletteQuantizer(false) };
img.Save(ms, options); return null;
img.Save(ms, options);
return null;
});
}
[Benchmark(Baseline = true, Description = "EncodeGifMultiple - System.Drawing")]
public void EncodeGifSystemDrawing()
{
this.ForEachSystemDrawingImage((img, ms) => { img.Save(ms, ImageFormat.Gif); return null; });
this.ForEachSystemDrawingImage((img, ms) =>
{
img.Save(ms, ImageFormat.Gif);
return null;
});
}
}
}
}

2
tests/ImageSharp.Benchmarks/Codecs/EncodeTga.cs

@ -28,7 +28,7 @@ namespace SixLabors.ImageSharp.Benchmarks.Codecs
{
if (this.tgaCore == null)
{
this.tgaCore = Image.Load<Rgba32>(TestImageFullPath);
this.tgaCore = Image.Load<Rgba32>(this.TestImageFullPath);
this.tgaMagick = new MagickImage(this.TestImageFullPath);
}
}

5
tests/ImageSharp.Benchmarks/Codecs/ImageBenchmarkTests.cs

@ -1,4 +1,4 @@
// Copyright (c) Six Labors and contributors.
// Copyright (c) Six Labors and contributors.
// Licensed under the Apache License, Version 2.0.
// This file contains small, cheap and "unit test" benchmarks to test MultiImageBenchmarkBase.
@ -6,7 +6,6 @@
// Uncomment this to enable benchmark testing
// #define TEST
#if TEST
// ReSharper disable InconsistentNaming
@ -76,4 +75,4 @@ namespace SixLabors.ImageSharp.Benchmarks.Codecs
}
}
#endif
#endif

6
tests/ImageSharp.Benchmarks/Codecs/Jpeg/BlockOperations/Block8x8F_CopyTo1x1.cs

@ -1,4 +1,4 @@
// Copyright (c) Six Labors and contributors.
// Copyright (c) Six Labors and contributors.
// Licensed under the Apache License, Version 2.0.
using System;
@ -9,8 +9,8 @@ using BenchmarkDotNet.Attributes;
using SixLabors.ImageSharp.Formats.Jpeg.Components;
using SixLabors.ImageSharp.Memory;
// ReSharper disable InconsistentNaming
// ReSharper disable InconsistentNaming
namespace SixLabors.ImageSharp.Benchmarks.Codecs.Jpeg.BlockOperations
{
public class Block8x8F_CopyTo1x1
@ -130,4 +130,4 @@ namespace SixLabors.ImageSharp.Benchmarks.Codecs.Jpeg.BlockOperations
// Conclusion:
// Doesn't worth to bother with this
}
}
}

7
tests/ImageSharp.Benchmarks/Codecs/Jpeg/BlockOperations/Block8x8F_CopyTo2x2.cs

@ -1,4 +1,4 @@
// Copyright (c) Six Labors and contributors.
// Copyright (c) Six Labors and contributors.
// Licensed under the Apache License, Version 2.0.
using System.Numerics;
@ -8,8 +8,8 @@ using BenchmarkDotNet.Attributes;
using SixLabors.ImageSharp.Formats.Jpeg.Components;
using SixLabors.ImageSharp.Memory;
// ReSharper disable InconsistentNaming
// ReSharper disable InconsistentNaming
namespace SixLabors.ImageSharp.Benchmarks.Codecs.Jpeg.BlockOperations
{
public class Block8x8F_CopyTo2x2
@ -335,7 +335,6 @@ namespace SixLabors.ImageSharp.Benchmarks.Codecs.Jpeg.BlockOperations
Unsafe.Add(ref dBottomLeft, 7) = wRight;
}
[Benchmark]
public void UseVector4_V2()
{
@ -409,4 +408,4 @@ namespace SixLabors.ImageSharp.Benchmarks.Codecs.Jpeg.BlockOperations
// UseVector4_SafeRightCorner | 58.97 ns | 0.4152 ns | 0.3884 ns | 0.64 | 0.02 |
// UseVector4_V2 | 41.88 ns | 0.3531 ns | 0.3303 ns | 0.45 | 0.01 |
}
}
}

19
tests/ImageSharp.Benchmarks/Codecs/Jpeg/BlockOperations/Block8x8F_DivideRound.cs

@ -9,7 +9,6 @@ using BenchmarkDotNet.Attributes;
using SixLabors.ImageSharp.Formats.Jpeg.Components;
// ReSharper disable InconsistentNaming
namespace SixLabors.ImageSharp.Benchmarks.Codecs.Jpeg.BlockOperations
{
/// <summary>
@ -32,7 +31,7 @@ namespace SixLabors.ImageSharp.Benchmarks.Codecs.Jpeg.BlockOperations
{
for (int i = 0; i < Block8x8F.Size; i++)
{
this.inputDividend[i] = i*44.8f;
this.inputDividend[i] = i * 44.8f;
this.inputDivisor[i] = 100 - i;
}
}
@ -54,10 +53,11 @@ namespace SixLabors.ImageSharp.Benchmarks.Codecs.Jpeg.BlockOperations
sum = 0;
for (int i = 0; i < Block8x8F.Size; i++)
{
int a = (int) pDividend[i];
int b = (int) pDivisor;
int a = (int)pDividend[i];
int b = (int)pDivisor;
result[i] = RationalRound(a, b);
}
for (int i = 0; i < Block8x8F.Size; i++)
{
sum += result[i];
@ -83,13 +83,15 @@ namespace SixLabors.ImageSharp.Benchmarks.Codecs.Jpeg.BlockOperations
for (int i = 0; i < Block8x8F.Size; i++)
{
double value = pDividend[i] / pDivisor[i];
pDividend[i] = (float) System.Math.Round(value);
pDividend[i] = (float)System.Math.Round(value);
}
for (int i = 0; i < Block8x8F.Size; i++)
{
sum += (int) pDividend[i];
sum += (int)pDividend[i];
}
}
return sum;
}
@ -111,6 +113,7 @@ namespace SixLabors.ImageSharp.Benchmarks.Codecs.Jpeg.BlockOperations
sum += (int)pDividend[i];
}
}
return sum;
}
@ -138,10 +141,10 @@ namespace SixLabors.ImageSharp.Benchmarks.Codecs.Jpeg.BlockOperations
[MethodImpl(MethodImplOptions.AggressiveInlining)]
private static Vector4 DivideRound(Vector4 dividend, Vector4 divisor)
{
Vector4 sign = Vector4.Min(dividend, Vector4.One);
var sign = Vector4.Min(dividend, Vector4.One);
sign = Vector4.Max(sign, MinusOne);
return dividend / divisor + sign * Half;
return (dividend / divisor) + (sign * Half);
}
[MethodImpl(MethodImplOptions.AggressiveInlining)]

7
tests/ImageSharp.Benchmarks/Codecs/Jpeg/BlockOperations/Block8x8F_LoadFromInt16.cs

@ -1,8 +1,6 @@
// Copyright (c) Six Labors and contributors.
// Copyright (c) Six Labors and contributors.
// Licensed under the Apache License, Version 2.0.
// ReSharper disable InconsistentNaming
using System;
using System.Numerics;
@ -10,6 +8,7 @@ using BenchmarkDotNet.Attributes;
using SixLabors.ImageSharp.Formats.Jpeg.Components;
// ReSharper disable InconsistentNaming
namespace SixLabors.ImageSharp.Benchmarks.Codecs.Jpeg.BlockOperations
{
public class Block8x8F_LoadFromInt16
@ -50,4 +49,4 @@ namespace SixLabors.ImageSharp.Benchmarks.Codecs.Jpeg.BlockOperations
// Scalar | 34.88 ns | 0.3296 ns | 0.3083 ns | 1.00 |
// ExtendedAvx2 | 21.58 ns | 0.2125 ns | 0.1884 ns | 0.62 |
}
}
}

3
tests/ImageSharp.Benchmarks/Codecs/Jpeg/BlockOperations/Block8x8F_Round.cs

@ -1,8 +1,6 @@
// Copyright (c) Six Labors and contributors.
// Licensed under the Apache License, Version 2.0.
// ReSharper disable InconsistentNaming
using System;
using System.Numerics;
using System.Runtime.CompilerServices;
@ -11,6 +9,7 @@ using BenchmarkDotNet.Attributes;
using SixLabors.ImageSharp.Formats.Jpeg.Components;
// ReSharper disable InconsistentNaming
namespace SixLabors.ImageSharp.Benchmarks.Codecs.Jpeg.BlockOperations
{
public class Block8x8F_Round

3
tests/ImageSharp.Benchmarks/Codecs/Jpeg/DecodeJpegParseStreamOnly.cs

@ -1,9 +1,10 @@
// Copyright (c) Six Labors and contributors.
// Licensed under the Apache License, Version 2.0.
using BenchmarkDotNet.Attributes;
using System.Drawing;
using System.IO;
using BenchmarkDotNet.Attributes;
using SixLabors.ImageSharp.Formats.Jpeg;
using SixLabors.ImageSharp.Tests;

6
tests/ImageSharp.Benchmarks/Codecs/Jpeg/DecodeJpeg_Aggregate.cs

@ -1,4 +1,4 @@
// Copyright (c) Six Labors and contributors.
// Copyright (c) Six Labors and contributors.
// Licensed under the Apache License, Version 2.0.
using System.Collections.Generic;
@ -10,8 +10,8 @@ using SixLabors.ImageSharp.PixelFormats;
using SixLabors.ImageSharp.Tests;
using SDImage = System.Drawing.Image;
// ReSharper disable InconsistentNaming
// ReSharper disable InconsistentNaming
namespace SixLabors.ImageSharp.Benchmarks.Codecs.Jpeg
{
/// <summary>
@ -45,4 +45,4 @@ namespace SixLabors.ImageSharp.Benchmarks.Codecs.Jpeg
this.ForEachStream(SDImage.FromStream);
}
}
}
}

51
tests/ImageSharp.Benchmarks/Codecs/Jpeg/DecodeJpeg_ImageSpecific.cs

@ -14,8 +14,8 @@ using SixLabors.ImageSharp.PixelFormats;
using SixLabors.ImageSharp.Tests;
using CoreSize = SixLabors.Primitives.Size;
using SDImage = System.Drawing.Image;
// ReSharper disable InconsistentNaming
// ReSharper disable InconsistentNaming
namespace SixLabors.ImageSharp.Benchmarks.Codecs.Jpeg
{
/// <summary>
@ -35,10 +35,8 @@ namespace SixLabors.ImageSharp.Benchmarks.Codecs.Jpeg
{
public ShortClr()
{
this.Add(
// Job.Default.With(ClrRuntime.Net472).WithLaunchCount(1).WithWarmupCount(2).WithIterationCount(3),
Job.Default.With(CoreRuntime.Core21).WithLaunchCount(1).WithWarmupCount(2).WithIterationCount(3)
);
// Job.Default.With(ClrRuntime.Net472).WithLaunchCount(1).WithWarmupCount(2).WithIterationCount(3),
this.Add(Job.Default.With(CoreRuntime.Core21).WithLaunchCount(1).WithWarmupCount(2).WithIterationCount(3));
}
}
}
@ -50,18 +48,15 @@ namespace SixLabors.ImageSharp.Benchmarks.Codecs.Jpeg
[Params(
TestImages.Jpeg.BenchmarkSuite.Lake_Small444YCbCr,
TestImages.Jpeg.BenchmarkSuite.BadRstProgressive518_Large444YCbCr,
/* The scaled result for the large image "ExifGetString750Transform_Huge420YCbCr"
is almost the same as the result for Jpeg420Exif,
which proves that the execution time for the most common YCbCr 420 path scales linearly.
TestImages.Jpeg.BenchmarkSuite.ExifGetString750Transform_Huge420YCbCr,
*/
TestImages.Jpeg.BenchmarkSuite.Jpeg420Exif_MidSizeYCbCr)]
// The scaled result for the large image "ExifGetString750Transform_Huge420YCbCr"
// is almost the same as the result for Jpeg420Exif,
// which proves that the execution time for the most common YCbCr 420 path scales linearly.
//
// TestImages.Jpeg.BenchmarkSuite.ExifGetString750Transform_Huge420YCbCr,
TestImages.Jpeg.BenchmarkSuite.Jpeg420Exif_MidSizeYCbCr
)]
public string TestImage { get; set; }
[GlobalSetup]
public void ReadImages()
{
@ -102,7 +97,7 @@ namespace SixLabors.ImageSharp.Benchmarks.Codecs.Jpeg
// Frequency=2742191 Hz, Resolution=364.6719 ns, Timer=TSC
// .NET Core SDK=2.1.403
// [Host] : .NET Core 2.1.5 (CoreCLR 4.6.26919.02, CoreFX 4.6.26919.02), 64bit RyuJIT
//
//
// Method | TestImage | Mean | Error | StdDev | Scaled | ScaledSD | Gen 0 | Gen 1 | Gen 2 | Allocated |
// ------------------------------- |-------------------------------------------- |-----------:|-----------:|----------:|-------:|---------:|----------:|---------:|---------:|------------:|
// 'Decode Jpeg - System.Drawing' | Jpg/baseline/Lake.jpg | 6.117 ms | 0.3923 ms | 0.0222 ms | 1.00 | 0.00 | 62.5000 | - | - | 205.83 KB |
@ -119,21 +114,21 @@ namespace SixLabors.ImageSharp.Benchmarks.Codecs.Jpeg
// RESULTS (2019 April 23):
//
//BenchmarkDotNet=v0.11.5, OS=Windows 10.0.17763.437 (1809/October2018Update/Redstone5)
//Intel Core i7-6600U CPU 2.60GHz (Skylake), 1 CPU, 4 logical and 2 physical cores
//.NET Core SDK=2.2.202
// BenchmarkDotNet=v0.11.5, OS=Windows 10.0.17763.437 (1809/October2018Update/Redstone5)
// Intel Core i7-6600U CPU 2.60GHz (Skylake), 1 CPU, 4 logical and 2 physical cores
// .NET Core SDK=2.2.202
// [Host] : .NET Core 2.1.9 (CoreCLR 4.6.27414.06, CoreFX 4.6.27415.01), 64bit RyuJIT
// Core : .NET Core 2.1.9 (CoreCLR 4.6.27414.06, CoreFX 4.6.27415.01), 64bit RyuJIT
//
//| Method | TestImage | Mean | Error | StdDev | Ratio | RatioSD | Gen 0 | Gen 1 | Gen 2 | Allocated |
//|------------------------------- |--------------------- |-----------:|-----------:|-----------:|------:|--------:|----------:|------:|------:|------------:|
//| 'Decode Jpeg - System.Drawing' | Jpg/b(...)e.jpg [21] | 6.957 ms | 9.618 ms | 0.5272 ms | 1.00 | 0.00 | 93.7500 | - | - | 205.83 KB |
//| 'Decode Jpeg - ImageSharp' | Jpg/b(...)e.jpg [21] | 18.348 ms | 8.876 ms | 0.4865 ms | 2.65 | 0.23 | - | - | - | 14.49 KB |
//| | | | | | | | | | | |
//| 'Decode Jpeg - System.Drawing' | Jpg/b(...)f.jpg [28] | 18.687 ms | 11.632 ms | 0.6376 ms | 1.00 | 0.00 | 343.7500 | - | - | 757.04 KB |
//| 'Decode Jpeg - ImageSharp' | Jpg/b(...)f.jpg [28] | 41.990 ms | 25.514 ms | 1.3985 ms | 2.25 | 0.10 | - | - | - | 15.48 KB |
//| | | | | | | | | | | |
//| 'Decode Jpeg - System.Drawing' | Jpg/i(...)e.jpg [43] | 477.265 ms | 732.126 ms | 40.1303 ms | 1.00 | 0.00 | 3000.0000 | - | - | 7403.76 KB |
//| 'Decode Jpeg - ImageSharp' | Jpg/i(...)e.jpg [43] | 348.545 ms | 91.480 ms | 5.0143 ms | 0.73 | 0.06 | - | - | - | 35177.21 KB |
// | Method | TestImage | Mean | Error | StdDev | Ratio | RatioSD | Gen 0 | Gen 1 | Gen 2 | Allocated |
// |------------------------------- |--------------------- |-----------:|-----------:|-----------:|------:|--------:|----------:|------:|------:|------------:|
// | 'Decode Jpeg - System.Drawing' | Jpg/b(...)e.jpg [21] | 6.957 ms | 9.618 ms | 0.5272 ms | 1.00 | 0.00 | 93.7500 | - | - | 205.83 KB |
// | 'Decode Jpeg - ImageSharp' | Jpg/b(...)e.jpg [21] | 18.348 ms | 8.876 ms | 0.4865 ms | 2.65 | 0.23 | - | - | - | 14.49 KB |
// | | | | | | | | | | | |
// | 'Decode Jpeg - System.Drawing' | Jpg/b(...)f.jpg [28] | 18.687 ms | 11.632 ms | 0.6376 ms | 1.00 | 0.00 | 343.7500 | - | - | 757.04 KB |
// | 'Decode Jpeg - ImageSharp' | Jpg/b(...)f.jpg [28] | 41.990 ms | 25.514 ms | 1.3985 ms | 2.25 | 0.10 | - | - | - | 15.48 KB |
// | | | | | | | | | | | |
// | 'Decode Jpeg - System.Drawing' | Jpg/i(...)e.jpg [43] | 477.265 ms | 732.126 ms | 40.1303 ms | 1.00 | 0.00 | 3000.0000 | - | - | 7403.76 KB |
// | 'Decode Jpeg - ImageSharp' | Jpg/i(...)e.jpg [43] | 348.545 ms | 91.480 ms | 5.0143 ms | 0.73 | 0.06 | - | - | - | 35177.21 KB |
}
}

49
tests/ImageSharp.Benchmarks/Codecs/Jpeg/DoubleBufferedStreams.cs

@ -125,28 +125,29 @@ namespace SixLabors.ImageSharp.Benchmarks.Codecs.Jpeg
}
}
// RESULTS (2019 April 24):
//
//BenchmarkDotNet=v0.11.5, OS=Windows 10.0.17763.437 (1809/October2018Update/Redstone5)
//Intel Core i7-6600U CPU 2.60GHz (Skylake), 1 CPU, 4 logical and 2 physical cores
//.NET Core SDK=2.2.202
// [Host] : .NET Core 2.1.9 (CoreCLR 4.6.27414.06, CoreFX 4.6.27415.01), 64bit RyuJIT
// Clr : .NET Framework 4.7.2 (CLR 4.0.30319.42000), 64bit RyuJIT-v4.7.3362.0
// Core : .NET Core 2.1.9 (CoreCLR 4.6.27414.06, CoreFX 4.6.27415.01), 64bit RyuJIT
//
//IterationCount=3 LaunchCount=1 WarmupCount=3
//
//| Method | Job | Runtime | Mean | Error | StdDev | Ratio | RatioSD | Gen 0 | Gen 1 | Gen 2 | Allocated |
//|----------------------------- |----- |-------- |---------:|-----------:|----------:|------:|--------:|------:|------:|------:|----------:|
//| StandardStreamReadByte | Clr | Clr | 96.71 us | 5.9950 us | 0.3286 us | 1.00 | 0.00 | - | - | - | - |
//| StandardStreamRead | Clr | Clr | 77.73 us | 5.2284 us | 0.2866 us | 0.80 | 0.00 | - | - | - | - |
//| DoubleBufferedStreamReadByte | Clr | Clr | 23.17 us | 26.2354 us | 1.4381 us | 0.24 | 0.01 | - | - | - | - |
//| DoubleBufferedStreamRead | Clr | Clr | 33.35 us | 3.4071 us | 0.1868 us | 0.34 | 0.00 | - | - | - | - |
//| SimpleReadByte | Clr | Clr | 10.85 us | 0.4927 us | 0.0270 us | 0.11 | 0.00 | - | - | - | - |
//| | | | | | | | | | | | |
//| StandardStreamReadByte | Core | Core | 75.35 us | 12.9789 us | 0.7114 us | 1.00 | 0.00 | - | - | - | - |
//| StandardStreamRead | Core | Core | 55.36 us | 1.4432 us | 0.0791 us | 0.73 | 0.01 | - | - | - | - |
//| DoubleBufferedStreamReadByte | Core | Core | 21.47 us | 29.7076 us | 1.6284 us | 0.28 | 0.02 | - | - | - | - |
//| DoubleBufferedStreamRead | Core | Core | 29.67 us | 2.5988 us | 0.1424 us | 0.39 | 0.00 | - | - | - | - |
//| SimpleReadByte | Core | Core | 10.84 us | 0.7567 us | 0.0415 us | 0.14 | 0.00 | - | - | - | - |
/* RESULTS (2019 April 24):
BenchmarkDotNet=v0.11.5, OS=Windows 10.0.17763.437 (1809/October2018Update/Redstone5)
Intel Core i7-6600U CPU 2.60GHz (Skylake), 1 CPU, 4 logical and 2 physical cores
.NET Core SDK=2.2.202
[Host] : .NET Core 2.1.9 (CoreCLR 4.6.27414.06, CoreFX 4.6.27415.01), 64bit RyuJIT
Clr : .NET Framework 4.7.2 (CLR 4.0.30319.42000), 64bit RyuJIT-v4.7.3362.0
Core : .NET Core 2.1.9 (CoreCLR 4.6.27414.06, CoreFX 4.6.27415.01), 64bit RyuJIT
IterationCount=3 LaunchCount=1 WarmupCount=3
| Method | Job | Runtime | Mean | Error | StdDev | Ratio | RatioSD | Gen 0 | Gen 1 | Gen 2 | Allocated |
|----------------------------- |----- |-------- |---------:|-----------:|----------:|------:|--------:|------:|------:|------:|----------:|
| StandardStreamReadByte | Clr | Clr | 96.71 us | 5.9950 us | 0.3286 us | 1.00 | 0.00 | - | - | - | - |
| StandardStreamRead | Clr | Clr | 77.73 us | 5.2284 us | 0.2866 us | 0.80 | 0.00 | - | - | - | - |
| DoubleBufferedStreamReadByte | Clr | Clr | 23.17 us | 26.2354 us | 1.4381 us | 0.24 | 0.01 | - | - | - | - |
| DoubleBufferedStreamRead | Clr | Clr | 33.35 us | 3.4071 us | 0.1868 us | 0.34 | 0.00 | - | - | - | - |
| SimpleReadByte | Clr | Clr | 10.85 us | 0.4927 us | 0.0270 us | 0.11 | 0.00 | - | - | - | - |
| | | | | | | | | | | | |
| StandardStreamReadByte | Core | Core | 75.35 us | 12.9789 us | 0.7114 us | 1.00 | 0.00 | - | - | - | - |
| StandardStreamRead | Core | Core | 55.36 us | 1.4432 us | 0.0791 us | 0.73 | 0.01 | - | - | - | - |
| DoubleBufferedStreamReadByte | Core | Core | 21.47 us | 29.7076 us | 1.6284 us | 0.28 | 0.02 | - | - | - | - |
| DoubleBufferedStreamRead | Core | Core | 29.67 us | 2.5988 us | 0.1424 us | 0.39 | 0.00 | - | - | - | - |
| SimpleReadByte | Core | Core | 10.84 us | 0.7567 us | 0.0415 us | 0.14 | 0.00 | - | - | - | - |
*/
}

9
tests/ImageSharp.Benchmarks/Codecs/Jpeg/EncodeJpeg.cs

@ -1,16 +1,15 @@
// Copyright (c) Six Labors and contributors.
// Copyright (c) Six Labors and contributors.
// Licensed under the Apache License, Version 2.0.
using SixLabors.ImageSharp.PixelFormats;
using BenchmarkDotNet.Attributes;
using SixLabors.ImageSharp.PixelFormats;
namespace SixLabors.ImageSharp.Benchmarks.Codecs.Jpeg
{
using System.Drawing;
using System.Drawing.Imaging;
using System.IO;
using CoreImage = SixLabors.ImageSharp.Image;
public class EncodeJpeg : BenchmarkBase
@ -58,4 +57,4 @@ namespace SixLabors.ImageSharp.Benchmarks.Codecs.Jpeg
}
}
}
}
}

16
tests/ImageSharp.Benchmarks/Codecs/Jpeg/EncodeJpegMultiple.cs

@ -1,4 +1,4 @@
// Copyright (c) Six Labors and contributors.
// Copyright (c) Six Labors and contributors.
// Licensed under the Apache License, Version 2.0.
using System.Collections.Generic;
@ -18,13 +18,21 @@ namespace SixLabors.ImageSharp.Benchmarks.Codecs.Jpeg
[Benchmark(Description = "EncodeJpegMultiple - ImageSharp")]
public void EncodeJpegImageSharp()
{
this.ForEachImageSharpImage((img, ms) => { img.Save(ms, new JpegEncoder()); return null; });
this.ForEachImageSharpImage((img, ms) =>
{
img.Save(ms, new JpegEncoder());
return null;
});
}
[Benchmark(Baseline = true, Description = "EncodeJpegMultiple - System.Drawing")]
public void EncodeJpegSystemDrawing()
{
this.ForEachSystemDrawingImage((img, ms) => { img.Save(ms, ImageFormat.Jpeg); return null; });
this.ForEachSystemDrawingImage((img, ms) =>
{
img.Save(ms, ImageFormat.Jpeg);
return null;
});
}
}
}
}

6
tests/ImageSharp.Benchmarks/Codecs/Jpeg/LoadResizeSave_Aggregate.cs

@ -1,4 +1,4 @@
// Copyright (c) Six Labors and contributors.
// Copyright (c) Six Labors and contributors.
// Licensed under the Apache License, Version 2.0.
using System.Collections.Generic;
@ -13,8 +13,8 @@ using SixLabors.ImageSharp.Formats.Jpeg;
using SixLabors.ImageSharp.PixelFormats;
using SixLabors.ImageSharp.Processing;
using SixLabors.ImageSharp.Tests;
// ReSharper disable InconsistentNaming
// ReSharper disable InconsistentNaming
namespace SixLabors.ImageSharp.Benchmarks.Codecs.Jpeg
{
[Config(typeof(MultiImageBenchmarkBase.Config))]
@ -93,4 +93,4 @@ namespace SixLabors.ImageSharp.Benchmarks.Codecs.Jpeg
});
}
}
}
}

22
tests/ImageSharp.Benchmarks/Codecs/Jpeg/LoadResizeSave_ImageSpecific.cs

@ -1,18 +1,20 @@
// Copyright (c) Six Labors and contributors.
// Copyright (c) Six Labors and contributors.
// Licensed under the Apache License, Version 2.0.
using BenchmarkDotNet.Attributes;
using System;
using System.IO;
using SixLabors.ImageSharp.Tests;
using System.Drawing;
using System.Drawing.Drawing2D;
using System.Drawing.Imaging;
using System.IO;
using BenchmarkDotNet.Attributes;
using SixLabors.ImageSharp.Formats.Jpeg;
using SixLabors.ImageSharp.Processing;
using SixLabors.ImageSharp.Tests;
using SDImage = System.Drawing.Image;
using SixLabors.ImageSharp.Formats.Jpeg;
// ReSharper disable InconsistentNaming
// ReSharper disable InconsistentNaming
namespace SixLabors.ImageSharp.Benchmarks.Codecs.Jpeg
{
[Config(typeof(Config.ShortClr))]
@ -29,9 +31,7 @@ namespace SixLabors.ImageSharp.Benchmarks.Codecs.Jpeg
[Params(
TestImages.Jpeg.BenchmarkSuite.Lake_Small444YCbCr,
TestImages.Jpeg.BenchmarkSuite.BadRstProgressive518_Large444YCbCr,
TestImages.Jpeg.BenchmarkSuite.Jpeg420Exif_MidSizeYCbCr
)]
TestImages.Jpeg.BenchmarkSuite.Jpeg420Exif_MidSizeYCbCr)]
public string TestImage { get; set; }
[Params(false, true)]
@ -89,7 +89,7 @@ namespace SixLabors.ImageSharp.Benchmarks.Codecs.Jpeg
// [Host] : .NET Core 2.1.5 (CoreCLR 4.6.26919.02, CoreFX 4.6.26919.02), 64bit RyuJIT
// Job-ZPEZGV : .NET Framework 4.7.1 (CLR 4.0.30319.42000), 64bit RyuJIT-v4.7.3190.0
// Job-SGOCJT : .NET Core 2.1.5 (CoreCLR 4.6.26919.02, CoreFX 4.6.26919.02), 64bit RyuJIT
//
//
// Method | Runtime | TestImage | ParallelExec | Mean | Error | StdDev | Scaled | ScaledSD | Gen 0 | Allocated |
// -------------- |-------- |----------------------------- |------------- |----------:|----------:|----------:|-------:|---------:|---------:|----------:|
// SystemDrawing | Clr | Jpg/baseline/jpeg420exif.jpg | False | 64.88 ms | 3.735 ms | 0.2110 ms | 1.00 | 0.00 | 250.0000 | 791.07 KB |
@ -104,4 +104,4 @@ namespace SixLabors.ImageSharp.Benchmarks.Codecs.Jpeg
// SystemDrawing | Core | Jpg/baseline/jpeg420exif.jpg | True | 64.20 ms | 6.560 ms | 0.3707 ms | 1.00 | 0.00 | 250.0000 | 789.79 KB |
// ImageSharp | Core | Jpg/baseline/jpeg420exif.jpg | True | 68.08 ms | 18.376 ms | 1.0383 ms | 1.06 | 0.01 | - | 50.49 KB |
}
}
}

2
tests/ImageSharp.Benchmarks/Codecs/Jpeg/YCbCrColorConversion.cs

@ -74,7 +74,7 @@ namespace SixLabors.ImageSharp.Benchmarks.Codecs.Jpeg
for (int j = 0; j < inputBufferLength; j++)
{
values[j] = (float)rnd.NextDouble() * (maxVal - minVal) + minVal;
values[j] = ((float)rnd.NextDouble() * (maxVal - minVal)) + minVal;
}
// no need to dispose when buffer is not array owner

55
tests/ImageSharp.Benchmarks/Codecs/MultiImageBenchmarkBase.cs

@ -20,7 +20,7 @@ namespace SixLabors.ImageSharp.Benchmarks.Codecs
using BenchmarkDotNet.Environments;
using SixLabors.ImageSharp.Tests;
using CoreImage = ImageSharp.Image;
using CoreImage = SixLabors.ImageSharp.Image;
public abstract class MultiImageBenchmarkBase
{
@ -36,27 +36,33 @@ namespace SixLabors.ImageSharp.Benchmarks.Codecs
{
public ShortClr()
{
this.Add(
Job.Default.With(CoreRuntime.Core21).WithLaunchCount(1).WithWarmupCount(1).WithIterationCount(2)
);
this.Add(Job.Default.With(CoreRuntime.Core21).WithLaunchCount(1).WithWarmupCount(1).WithIterationCount(2));
}
}
}
protected Dictionary<string, byte[]> FileNamesToBytes = new Dictionary<string, byte[]>();
protected Dictionary<string, Image<Rgba32>> FileNamesToImageSharpImages = new Dictionary<string, Image<Rgba32>>();
protected Dictionary<string, Bitmap> FileNamesToSystemDrawingImages = new Dictionary<string, System.Drawing.Bitmap>();
protected Dictionary<string, byte[]> fileNamesToBytes = new Dictionary<string, byte[]>();
protected Dictionary<string, Image<Rgba32>> fileNamesToImageSharpImages = new Dictionary<string, Image<Rgba32>>();
protected Dictionary<string, Bitmap> fileNamesToSystemDrawingImages = new Dictionary<string, System.Drawing.Bitmap>();
/// <summary>
/// The values of this enum separate input files into categories
/// The values of this enum separate input files into categories.
/// </summary>
public enum InputImageCategory
{
/// <summary>
/// Use all images.
/// </summary>
AllImages,
/// <summary>
/// Use small images only.
/// </summary>
SmallImagesOnly,
/// <summary>
/// Use large images only.
/// </summary>
LargeImagesOnly
}
@ -73,12 +79,13 @@ namespace SixLabors.ImageSharp.Benchmarks.Codecs
protected virtual IEnumerable<string> ExcludeSubstringsInFileNames => new[] { "badeof", "BadEof", "CriticalEOF" };
/// <summary>
/// Enumerates folders containing files OR files to be processed by the benchmark.
/// Gets folders containing files OR files to be processed by the benchmark.
/// </summary>
protected IEnumerable<string> AllFoldersOrFiles => this.InputImageSubfoldersOrFiles.Select(f => Path.Combine(this.BaseFolder, f));
/// <summary>
/// The images sized above this threshold will be included in
/// Gets the large image threshold.
/// The images sized above this threshold will be included in.
/// </summary>
protected virtual int LargeImageThresholdInBytes => 100000;
@ -102,7 +109,7 @@ namespace SixLabors.ImageSharp.Benchmarks.Codecs
protected IEnumerable<KeyValuePair<string, byte[]>> FileNames2Bytes
=>
this.EnumeratePairsByBenchmarkSettings(
this.FileNamesToBytes,
this.fileNamesToBytes,
arr => arr.Length < this.LargeImageThresholdInBytes);
protected abstract IEnumerable<string> InputImageSubfoldersOrFiles { get; }
@ -114,6 +121,7 @@ namespace SixLabors.ImageSharp.Benchmarks.Codecs
{
throw new Exception("Vector.IsHardwareAccelerated == false! Check your build settings!");
}
// Console.WriteLine("Vector.IsHardwareAccelerated: " + Vector.IsHardwareAccelerated);
this.ReadFilesImpl();
}
@ -124,7 +132,7 @@ namespace SixLabors.ImageSharp.Benchmarks.Codecs
{
if (File.Exists(path))
{
this.FileNamesToBytes[path] = File.ReadAllBytes(path);
this.fileNamesToBytes[path] = File.ReadAllBytes(path);
continue;
}
@ -138,7 +146,7 @@ namespace SixLabors.ImageSharp.Benchmarks.Codecs
foreach (string fn in allFiles)
{
this.FileNamesToBytes[fn] = File.ReadAllBytes(fn);
this.fileNamesToBytes[fn] = File.ReadAllBytes(fn);
}
}
}
@ -157,7 +165,6 @@ namespace SixLabors.ImageSharp.Benchmarks.Codecs
{
object obj = operation(memoryStream);
(obj as IDisposable)?.Dispose();
}
catch (Exception ex)
{
@ -173,31 +180,30 @@ namespace SixLabors.ImageSharp.Benchmarks.Codecs
{
base.ReadFilesImpl();
foreach (KeyValuePair<string, byte[]> kv in this.FileNamesToBytes)
foreach (KeyValuePair<string, byte[]> kv in this.fileNamesToBytes)
{
byte[] bytes = kv.Value;
string fn = kv.Key;
using (var ms1 = new MemoryStream(bytes))
{
this.FileNamesToImageSharpImages[fn] = CoreImage.Load<Rgba32>(ms1);
this.fileNamesToImageSharpImages[fn] = CoreImage.Load<Rgba32>(ms1);
}
this.FileNamesToSystemDrawingImages[fn] = new Bitmap(new MemoryStream(bytes));
this.fileNamesToSystemDrawingImages[fn] = new Bitmap(new MemoryStream(bytes));
}
}
protected IEnumerable<KeyValuePair<string, Image<Rgba32>>> FileNames2ImageSharpImages
=>
this.EnumeratePairsByBenchmarkSettings(
this.FileNamesToImageSharpImages,
this.fileNamesToImageSharpImages,
img => img.Width * img.Height < this.LargeImageThresholdInPixels);
protected IEnumerable<KeyValuePair<string, System.Drawing.Bitmap>> FileNames2SystemDrawingImages
=>
this.EnumeratePairsByBenchmarkSettings(
this.FileNamesToSystemDrawingImages,
this.fileNamesToSystemDrawingImages,
img => img.Width * img.Height < this.LargeImageThresholdInPixels);
protected virtual int LargeImageThresholdInPixels => 700000;
@ -210,13 +216,11 @@ namespace SixLabors.ImageSharp.Benchmarks.Codecs
{
object obj = operation(kv.Value);
(obj as IDisposable)?.Dispose();
}
catch (Exception ex)
{
Console.WriteLine($"Operation on {kv.Key} failed with {ex.Message}");
}
}
}
@ -224,13 +228,13 @@ namespace SixLabors.ImageSharp.Benchmarks.Codecs
{
using (var workStream = new MemoryStream())
{
this.ForEachImageSharpImage(
img =>
{
// ReSharper disable AccessToDisposedClosure
object result = operation(img, workStream);
workStream.Seek(0, SeekOrigin.Begin);
// ReSharper restore AccessToDisposedClosure
return result;
});
@ -257,18 +261,17 @@ namespace SixLabors.ImageSharp.Benchmarks.Codecs
{
using (var workStream = new MemoryStream())
{
this.ForEachSystemDrawingImage(
img =>
{
// ReSharper disable AccessToDisposedClosure
object result = operation(img, workStream);
workStream.Seek(0, SeekOrigin.Begin);
// ReSharper restore AccessToDisposedClosure
return result;
});
}
}
}
}

14
tests/ImageSharp.Benchmarks/Color/Bulk/FromRgba32Bytes.cs

@ -1,16 +1,14 @@
// Copyright (c) Six Labors and contributors.
// Licensed under the Apache License, Version 2.0.
// ReSharper disable InconsistentNaming
using System.Buffers;
using System;
using System.Buffers;
using BenchmarkDotNet.Attributes;
using SixLabors.ImageSharp.Memory;
using SixLabors.ImageSharp.PixelFormats;
// ReSharper disable InconsistentNaming
namespace SixLabors.ImageSharp.Benchmarks.ColorSpaces.Bulk
{
public abstract class FromRgba32Bytes<TPixel>
@ -23,7 +21,7 @@ namespace SixLabors.ImageSharp.Benchmarks.ColorSpaces.Bulk
private Configuration configuration;
[Params(
128,
128,
1024,
2048)]
public int Count { get; set; }
@ -43,12 +41,12 @@ namespace SixLabors.ImageSharp.Benchmarks.ColorSpaces.Bulk
this.source.Dispose();
}
//[Benchmark]
// [Benchmark]
public void Naive()
{
Span<byte> s = this.source.GetSpan();
Span<TPixel> d = this.destination.GetSpan();
for (int i = 0; i < this.Count; i++)
{
int i4 = i * 4;
@ -89,4 +87,4 @@ namespace SixLabors.ImageSharp.Benchmarks.ColorSpaces.Bulk
// CommonBulk | 2048 | 2,625.4 ns | 30.143 ns | 26.721 ns | 1.00 |
// OptimizedBulk | 2048 | 1,843.0 ns | 20.505 ns | 18.177 ns | 0.70 |
}
}
}

13
tests/ImageSharp.Benchmarks/Color/Bulk/FromVector4.cs

@ -1,8 +1,6 @@
// Copyright (c) Six Labors and contributors.
// Licensed under the Apache License, Version 2.0.
// ReSharper disable InconsistentNaming
using System;
using System.Buffers;
using System.Numerics;
@ -14,6 +12,7 @@ using BenchmarkDotNet.Attributes;
using SixLabors.ImageSharp.Memory;
using SixLabors.ImageSharp.PixelFormats;
// ReSharper disable InconsistentNaming
namespace SixLabors.ImageSharp.Benchmarks.ColorSpaces.Bulk
{
[Config(typeof(Config.ShortClr))]
@ -26,10 +25,7 @@ namespace SixLabors.ImageSharp.Benchmarks.ColorSpaces.Bulk
protected Configuration Configuration => Configuration.Default;
[Params(
64,
2048
)]
[Params(64, 2048)]
public int Count { get; set; }
[GlobalSetup]
@ -46,12 +42,11 @@ namespace SixLabors.ImageSharp.Benchmarks.ColorSpaces.Bulk
this.source.Dispose();
}
//[Benchmark]
// [Benchmark]
public void PerElement()
{
ref Vector4 s = ref MemoryMarshal.GetReference(this.source.GetSpan());
ref TPixel d = ref MemoryMarshal.GetReference(this.destination.GetSpan());
for (int i = 0; i < this.Count; i++)
{
Unsafe.Add(ref d, i).FromVector4(Unsafe.Add(ref s, i));
@ -127,4 +122,4 @@ namespace SixLabors.ImageSharp.Benchmarks.ColorSpaces.Bulk
// PixelOperations_Base | Core | 2048 | 16,875.73 ns | 1,271.957 ns | 71.8679 ns | 4.30 | 0.10 | - | 24 B |
// PixelOperations_Specialized | Core | 2048 | 2,129.92 ns | 262.888 ns | 14.8537 ns |!! 0.54 | 0.01 | - | 0 B | <--- ExtendedIntrinsics rock!
}
}
}

5
tests/ImageSharp.Benchmarks/Color/Bulk/Rgb24Bytes.cs

@ -1,13 +1,12 @@
// Copyright (c) Six Labors and contributors.
// Licensed under the Apache License, Version 2.0.
// ReSharper disable InconsistentNaming
using System.Buffers;
using BenchmarkDotNet.Attributes;
using SixLabors.ImageSharp.Memory;
using SixLabors.ImageSharp.PixelFormats;
// ReSharper disable InconsistentNaming
namespace SixLabors.ImageSharp.Benchmarks.ColorSpaces.Bulk
{
public abstract class Rgb24Bytes<TPixel>
@ -57,4 +56,4 @@ namespace SixLabors.ImageSharp.Benchmarks.ColorSpaces.Bulk
public class Rgb24Bytes_Rgba32 : Rgb24Bytes<Rgba32>
{
}
}
}

5
tests/ImageSharp.Benchmarks/Color/Bulk/ToRgba32Bytes.cs

@ -1,4 +1,4 @@
// Copyright (c) Six Labors and contributors.
// Copyright (c) Six Labors and contributors.
// Licensed under the Apache License, Version 2.0.
using System;
@ -9,7 +9,6 @@ using SixLabors.ImageSharp.Memory;
using SixLabors.ImageSharp.PixelFormats;
// ReSharper disable InconsistentNaming
namespace SixLabors.ImageSharp.Benchmarks.ColorSpaces.Bulk
{
public abstract class ToRgba32Bytes<TPixel>
@ -39,7 +38,7 @@ namespace SixLabors.ImageSharp.Benchmarks.ColorSpaces.Bulk
this.destination.Dispose();
}
//[Benchmark]
// [Benchmark]
public void Naive()
{
Span<TPixel> s = this.source.GetSpan();

18
tests/ImageSharp.Benchmarks/Color/Bulk/ToVector4.cs

@ -1,17 +1,15 @@
// Copyright (c) Six Labors and contributors.
// Licensed under the Apache License, Version 2.0.
// ReSharper disable InconsistentNaming
using System.Buffers;
using System;
using System.Buffers;
using System.Numerics;
using BenchmarkDotNet.Attributes;
using SixLabors.ImageSharp.Memory;
using SixLabors.ImageSharp.PixelFormats;
// ReSharper disable InconsistentNaming
namespace SixLabors.ImageSharp.Benchmarks.ColorSpaces.Bulk
{
public abstract class ToVector4<TPixel>
@ -23,12 +21,7 @@ namespace SixLabors.ImageSharp.Benchmarks.ColorSpaces.Bulk
protected Configuration Configuration => Configuration.Default;
[Params(
64,
256,
//512,
//1024,
2048)]
[Params(64, 256, 2048)] // 512, 1024
public int Count { get; set; }
[GlobalSetup]
@ -45,7 +38,7 @@ namespace SixLabors.ImageSharp.Benchmarks.ColorSpaces.Bulk
this.destination.Dispose();
}
//[Benchmark]
// [Benchmark]
public void Naive()
{
Span<TPixel> s = this.source.GetSpan();
@ -56,7 +49,6 @@ namespace SixLabors.ImageSharp.Benchmarks.ColorSpaces.Bulk
d[i] = s[i].ToVector4();
}
}
[Benchmark]
public void PixelOperations_Specialized()
@ -67,4 +59,4 @@ namespace SixLabors.ImageSharp.Benchmarks.ColorSpaces.Bulk
this.destination.GetSpan());
}
}
}
}

5
tests/ImageSharp.Benchmarks/Color/Bulk/ToVector4_Bgra32.cs

@ -1,3 +1,6 @@
// Copyright (c) Six Labors and contributors.
// Licensed under the Apache License, Version 2.0.
using BenchmarkDotNet.Attributes;
using SixLabors.ImageSharp.Memory;
@ -38,4 +41,4 @@ namespace SixLabors.ImageSharp.Benchmarks.ColorSpaces.Bulk
// PixelOperations_Base | Core | 2048 | 6,937.5 ns | 1,692.19 ns | 95.6121 ns | 1.00 | 0.00 | - | 24 B |
// PixelOperations_Specialized | Core | 2048 | 2,994.5 ns | 1,126.65 ns | 63.6578 ns | 0.43 | 0.01 | - | 0 B |
}
}
}

68
tests/ImageSharp.Benchmarks/Color/Bulk/ToVector4_Rgba32.cs

@ -1,3 +1,6 @@
// Copyright (c) Six Labors and contributors.
// Licensed under the Apache License, Version 2.0.
using System;
using System.Numerics;
using System.Runtime.CompilerServices;
@ -49,7 +52,7 @@ namespace SixLabors.ImageSharp.Benchmarks.ColorSpaces.Bulk
SimdUtils.ExtendedIntrinsics.BulkConvertByteToNormalizedFloat(sBytes, dFloats);
}
//[Benchmark]
// [Benchmark]
public void ExtendedIntrinsics_BulkConvertByteToNormalizedFloat_2Loops()
{
Span<byte> sBytes = MemoryMarshal.Cast<Rgba32, byte>(this.source.GetSpan());
@ -91,7 +94,7 @@ namespace SixLabors.ImageSharp.Benchmarks.ColorSpaces.Bulk
}
}
//[Benchmark]
// [Benchmark]
public void ExtendedIntrinsics_BulkConvertByteToNormalizedFloat_ConvertInSameLoop()
{
Span<byte> sBytes = MemoryMarshal.Cast<Rgba32, byte>(this.source.GetSpan());
@ -127,38 +130,39 @@ namespace SixLabors.ImageSharp.Benchmarks.ColorSpaces.Bulk
[MethodImpl(MethodImplOptions.AggressiveInlining)]
private static Vector<float> ConvertToNormalizedSingle(Vector<uint> u, Vector<float> scale)
{
Vector<int> vi = Vector.AsVectorInt32(u);
Vector<float> v = Vector.ConvertToSingle(vi);
var vi = Vector.AsVectorInt32(u);
var v = Vector.ConvertToSingle(vi);
v *= scale;
return v;
}
// RESULTS (2018 October):
//
// Method | Runtime | Count | Mean | Error | StdDev | Scaled | ScaledSD | Gen 0 | Allocated |
// ---------------------------- |-------- |------ |------------:|-------------:|------------:|-------:|---------:|-------:|----------:|
// FallbackIntrinsics128 | Clr | 64 | 287.62 ns | 6.026 ns | 0.3405 ns | 1.19 | 0.00 | - | 0 B |
// BasicIntrinsics256 | Clr | 64 | 240.83 ns | 10.585 ns | 0.5981 ns | 1.00 | 0.00 | - | 0 B |
// ExtendedIntrinsics | Clr | 64 | 168.28 ns | 11.478 ns | 0.6485 ns | 0.70 | 0.00 | - | 0 B |
// PixelOperations_Base | Clr | 64 | 334.08 ns | 38.048 ns | 2.1498 ns | 1.39 | 0.01 | 0.0072 | 24 B |
// PixelOperations_Specialized | Clr | 64 | 255.41 ns | 10.939 ns | 0.6181 ns | 1.06 | 0.00 | - | 0 B | <--- ceremonial overhead has been minimized!
// | | | | | | | | | |
// FallbackIntrinsics128 | Core | 64 | 183.29 ns | 8.931 ns | 0.5046 ns | 1.32 | 0.00 | - | 0 B |
// BasicIntrinsics256 | Core | 64 | 139.18 ns | 7.633 ns | 0.4313 ns | 1.00 | 0.00 | - | 0 B |
// ExtendedIntrinsics | Core | 64 | 66.29 ns | 16.366 ns | 0.9247 ns | 0.48 | 0.01 | - | 0 B |
// PixelOperations_Base | Core | 64 | 257.75 ns | 16.959 ns | 0.9582 ns | 1.85 | 0.01 | 0.0072 | 24 B |
// PixelOperations_Specialized | Core | 64 | 90.14 ns | 9.955 ns | 0.5625 ns | 0.65 | 0.00 | - | 0 B |
// | | | | | | | | | |
// FallbackIntrinsics128 | Clr | 2048 | 5,011.84 ns | 347.991 ns | 19.6621 ns | 1.22 | 0.01 | - | 0 B |
// BasicIntrinsics256 | Clr | 2048 | 4,119.35 ns | 720.153 ns | 40.6900 ns | 1.00 | 0.00 | - | 0 B |
// ExtendedIntrinsics | Clr | 2048 | 1,195.29 ns | 164.389 ns | 9.2883 ns |!! 0.29 | 0.00 | - | 0 B | <--- ExtendedIntrinsics rock!
// PixelOperations_Base | Clr | 2048 | 6,820.58 ns | 823.433 ns | 46.5255 ns | 1.66 | 0.02 | - | 24 B |
// PixelOperations_Specialized | Clr | 2048 | 4,203.53 ns | 176.714 ns | 9.9847 ns | 1.02 | 0.01 | - | 0 B | <--- can't yet detect whether ExtendedIntrinsics are available :(
// | | | | | | | | | |
// FallbackIntrinsics128 | Core | 2048 | 5,017.89 ns | 4,021.533 ns | 227.2241 ns | 1.24 | 0.05 | - | 0 B |
// BasicIntrinsics256 | Core | 2048 | 4,046.51 ns | 1,150.390 ns | 64.9992 ns | 1.00 | 0.00 | - | 0 B |
// ExtendedIntrinsics | Core | 2048 | 1,130.59 ns | 832.588 ns | 47.0427 ns |!! 0.28 | 0.01 | - | 0 B | <--- ExtendedIntrinsics rock!
// PixelOperations_Base | Core | 2048 | 6,752.68 ns | 272.820 ns | 15.4148 ns | 1.67 | 0.02 | - | 24 B |
// PixelOperations_Specialized | Core | 2048 | 1,126.13 ns | 79.192 ns | 4.4745 ns |!! 0.28 | 0.00 | - | 0 B | <--- ExtendedIntrinsics rock!
/*RESULTS (2018 October):
Method | Runtime | Count | Mean | Error | StdDev | Scaled | ScaledSD | Gen 0 | Allocated |
---------------------------- |-------- |------ |------------:|-------------:|------------:|-------:|---------:|-------:|----------:|
FallbackIntrinsics128 | Clr | 64 | 287.62 ns | 6.026 ns | 0.3405 ns | 1.19 | 0.00 | - | 0 B |
BasicIntrinsics256 | Clr | 64 | 240.83 ns | 10.585 ns | 0.5981 ns | 1.00 | 0.00 | - | 0 B |
ExtendedIntrinsics | Clr | 64 | 168.28 ns | 11.478 ns | 0.6485 ns | 0.70 | 0.00 | - | 0 B |
PixelOperations_Base | Clr | 64 | 334.08 ns | 38.048 ns | 2.1498 ns | 1.39 | 0.01 | 0.0072 | 24 B |
PixelOperations_Specialized | Clr | 64 | 255.41 ns | 10.939 ns | 0.6181 ns | 1.06 | 0.00 | - | 0 B | <--- ceremonial overhead has been minimized!
| | | | | | | | | |
FallbackIntrinsics128 | Core | 64 | 183.29 ns | 8.931 ns | 0.5046 ns | 1.32 | 0.00 | - | 0 B |
BasicIntrinsics256 | Core | 64 | 139.18 ns | 7.633 ns | 0.4313 ns | 1.00 | 0.00 | - | 0 B |
ExtendedIntrinsics | Core | 64 | 66.29 ns | 16.366 ns | 0.9247 ns | 0.48 | 0.01 | - | 0 B |
PixelOperations_Base | Core | 64 | 257.75 ns | 16.959 ns | 0.9582 ns | 1.85 | 0.01 | 0.0072 | 24 B |
PixelOperations_Specialized | Core | 64 | 90.14 ns | 9.955 ns | 0.5625 ns | 0.65 | 0.00 | - | 0 B |
| | | | | | | | | |
FallbackIntrinsics128 | Clr | 2048 | 5,011.84 ns | 347.991 ns | 19.6621 ns | 1.22 | 0.01 | - | 0 B |
BasicIntrinsics256 | Clr | 2048 | 4,119.35 ns | 720.153 ns | 40.6900 ns | 1.00 | 0.00 | - | 0 B |
ExtendedIntrinsics | Clr | 2048 | 1,195.29 ns | 164.389 ns | 9.2883 ns |!! 0.29 | 0.00 | - | 0 B | <--- ExtendedIntrinsics rock!
PixelOperations_Base | Clr | 2048 | 6,820.58 ns | 823.433 ns | 46.5255 ns | 1.66 | 0.02 | - | 24 B |
PixelOperations_Specialized | Clr | 2048 | 4,203.53 ns | 176.714 ns | 9.9847 ns | 1.02 | 0.01 | - | 0 B | <--- can't yet detect whether ExtendedIntrinsics are available :(
| | | | | | | | | |
FallbackIntrinsics128 | Core | 2048 | 5,017.89 ns | 4,021.533 ns | 227.2241 ns | 1.24 | 0.05 | - | 0 B |
BasicIntrinsics256 | Core | 2048 | 4,046.51 ns | 1,150.390 ns | 64.9992 ns | 1.00 | 0.00 | - | 0 B |
ExtendedIntrinsics | Core | 2048 | 1,130.59 ns | 832.588 ns | 47.0427 ns |!! 0.28 | 0.01 | - | 0 B | <--- ExtendedIntrinsics rock!
PixelOperations_Base | Core | 2048 | 6,752.68 ns | 272.820 ns | 15.4148 ns | 1.67 | 0.02 | - | 24 B |
PixelOperations_Specialized | Core | 2048 | 1,126.13 ns | 79.192 ns | 4.4745 ns |!! 0.28 | 0.00 | - | 0 B | <--- ExtendedIntrinsics rock!
*/
}
}
}

8
tests/ImageSharp.Benchmarks/Color/ColorspaceCieXyzToCieLabConvert.cs

@ -1,4 +1,7 @@
using BenchmarkDotNet.Attributes;
// Copyright (c) Six Labors and contributors.
// Licensed under the Apache License, Version 2.0.
using BenchmarkDotNet.Attributes;
using Colourful;
using Colourful.Conversion;
@ -18,7 +21,6 @@ namespace SixLabors.ImageSharp.Benchmarks.ColorSpaces
private static readonly ColourfulConverter ColourfulConverter = new ColourfulConverter();
[Benchmark(Baseline = true, Description = "Colourful Convert")]
public double ColourfulConvert()
{
@ -31,4 +33,4 @@ namespace SixLabors.ImageSharp.Benchmarks.ColorSpaces
return ColorSpaceConverter.ToCieLab(CieXyz).L;
}
}
}
}

7
tests/ImageSharp.Benchmarks/Color/ColorspaceCieXyzToHunterLabConvert.cs

@ -1,4 +1,7 @@
using BenchmarkDotNet.Attributes;
// Copyright (c) Six Labors and contributors.
// Licensed under the Apache License, Version 2.0.
using BenchmarkDotNet.Attributes;
using Colourful;
using Colourful.Conversion;
@ -30,4 +33,4 @@ namespace SixLabors.ImageSharp.Benchmarks.ColorSpaces
return ColorSpaceConverter.ToHunterLab(CieXyz).L;
}
}
}
}

5
tests/ImageSharp.Benchmarks/Color/ColorspaceCieXyzToLmsConvert.cs

@ -1,4 +1,7 @@
using BenchmarkDotNet.Attributes;
// Copyright (c) Six Labors and contributors.
// Licensed under the Apache License, Version 2.0.
using BenchmarkDotNet.Attributes;
using Colourful;
using Colourful.Conversion;

10
tests/ImageSharp.Benchmarks/Color/ColorspaceCieXyzToRgbConvert.cs

@ -1,11 +1,14 @@
using BenchmarkDotNet.Attributes;
// Copyright (c) Six Labors and contributors.
// Licensed under the Apache License, Version 2.0.
using BenchmarkDotNet.Attributes;
using Colourful;
using Colourful.Conversion;
using SixLabors.ImageSharp.ColorSpaces;
using SixLabors.ImageSharp.ColorSpaces.Conversion;
namespace SixLabors.ImageSharp.Benchmarks.ColorSpaces
{
public class ColorspaceCieXyzToRgbConvert
@ -18,7 +21,6 @@ namespace SixLabors.ImageSharp.Benchmarks.ColorSpaces
private static readonly ColourfulConverter ColourfulConverter = new ColourfulConverter();
[Benchmark(Baseline = true, Description = "Colourful Convert")]
public double ColourfulConvert()
{
@ -31,4 +33,4 @@ namespace SixLabors.ImageSharp.Benchmarks.ColorSpaces
return ColorSpaceConverter.ToRgb(CieXyz).R;
}
}
}
}

7
tests/ImageSharp.Benchmarks/Color/RgbToYCbCr.LookupTables.cs

@ -1,4 +1,7 @@
namespace SixLabors.ImageSharp.Benchmarks
// Copyright (c) Six Labors and contributors.
// Licensed under the Apache License, Version 2.0.
namespace SixLabors.ImageSharp.Benchmarks
{
public partial class RgbToYCbCr
{
@ -234,4 +237,4 @@
};
}
}
}
}

11
tests/ImageSharp.Benchmarks/Color/RgbToYCbCr.cs

@ -98,6 +98,7 @@ namespace SixLabors.ImageSharp.Benchmarks
{
result.Data[i] = data[i];
}
return result;
}
}
@ -125,6 +126,7 @@ namespace SixLabors.ImageSharp.Benchmarks
{
this.inputSourceRGB[i] = (byte)(42 + i);
}
this.inputSourceRGBAsInteger = new int[InputByteCount + Vector<int>.Count]; // Filling this should be part of the measured operation
}
@ -139,7 +141,6 @@ namespace SixLabors.ImageSharp.Benchmarks
var yPtr = (float*)&result.Y;
var cbPtr = (float*)&result.Cb;
var crPtr = (float*)&result.Cr;
// end of code-bloat block :)
for (int i = 0; i < InputColorCount; i++)
{
@ -165,7 +166,6 @@ namespace SixLabors.ImageSharp.Benchmarks
var yPtr = (float*)&result.Y;
var cbPtr = (float*)&result.Cb;
var crPtr = (float*)&result.Cr;
// end of code-bloat block :)
for (int i = 0; i < InputColorCount; i++)
{
@ -174,8 +174,7 @@ namespace SixLabors.ImageSharp.Benchmarks
var vectorRgb = new Vector3(
input.Data[i3 + 0],
input.Data[i3 + 1],
input.Data[i3 + 2]
);
input.Data[i3 + 2]);
Vector3 vectorY = VectorY * vectorRgb;
Vector3 vectorCb = VectorCb * vectorRgb;
@ -197,7 +196,6 @@ namespace SixLabors.ImageSharp.Benchmarks
var yPtr = (float*)&result.Y;
var cbPtr = (float*)&result.Cb;
var crPtr = (float*)&result.Cr;
// end of code-bloat block :)
var yCoeffs = new Vector<int>(ScaledCoeffs.Y);
var cbCoeffs = new Vector<int>(ScaledCoeffs.Cb);
@ -243,7 +241,6 @@ namespace SixLabors.ImageSharp.Benchmarks
float* yPtr = (float*)&result.Y;
float* cbPtr = (float*)&result.Cb;
float* crPtr = (float*)&result.Cr;
// end of code-bloat block :)
var yCoeffs = new Vector<int>(ScaledCoeffs.Y);
var cbCoeffs = new Vector<int>(ScaledCoeffs.Cb);
@ -306,7 +303,6 @@ namespace SixLabors.ImageSharp.Benchmarks
float* yPtr = (float*)&result.Y;
float* cbPtr = (float*)&result.Cb;
float* crPtr = (float*)&result.Cr;
// end of code-bloat block :)
for (int i = 0; i < InputColorCount; i++)
{
@ -345,7 +341,6 @@ namespace SixLabors.ImageSharp.Benchmarks
float* yPtr = (float*)&result.Y;
float* cbPtr = (float*)&result.Cb;
float* crPtr = (float*)&result.Cr;
// end of code-bloat block :)
for (int i = 0; i < InputColorCount; i++)
{

5
tests/ImageSharp.Benchmarks/Color/RgbWorkingSpaceAdapt.cs

@ -1,4 +1,7 @@
using BenchmarkDotNet.Attributes;
// Copyright (c) Six Labors and contributors.
// Licensed under the Apache License, Version 2.0.
using BenchmarkDotNet.Attributes;
using Colourful;
using Colourful.Conversion;

5
tests/ImageSharp.Benchmarks/Color/YcbCrToRgb.cs

@ -1,4 +1,7 @@
namespace SixLabors.ImageSharp.Benchmarks
// Copyright (c) Six Labors and contributors.
// Licensed under the Apache License, Version 2.0.
namespace SixLabors.ImageSharp.Benchmarks
{
using System.Numerics;

3
tests/ImageSharp.Benchmarks/Config.cs

@ -22,8 +22,7 @@ namespace SixLabors.ImageSharp.Benchmarks
this.Add(
Job.Default.With(ClrRuntime.Net472).WithLaunchCount(1).WithWarmupCount(3).WithIterationCount(3),
Job.Default.With(CoreRuntime.Core31).WithLaunchCount(1).WithWarmupCount(3).WithIterationCount(3),
Job.Default.With(CoreRuntime.Core21).WithLaunchCount(1).WithWarmupCount(3).WithIterationCount(3)
);
Job.Default.With(CoreRuntime.Core21).WithLaunchCount(1).WithWarmupCount(3).WithIterationCount(3));
}
}
}

16
tests/ImageSharp.Benchmarks/General/Array2D.cs

@ -1,4 +1,4 @@
// Copyright (c) Six Labors and contributors.
// Copyright (c) Six Labors and contributors.
// Licensed under the Apache License, Version 2.0.
using System;
@ -9,8 +9,8 @@ using SixLabors.ImageSharp.Primitives;
namespace SixLabors.ImageSharp.Benchmarks.General
{
/**
* Method | Count | Mean | Error | StdDev | Scaled | ScaledSD |
/*
Method | Count | Mean | Error | StdDev | Scaled | ScaledSD |
-------------------------------------------- |------ |---------:|---------:|---------:|-------:|---------:|
'Emulated 2D array access using flat array' | 32 | 224.2 ns | 4.739 ns | 13.75 ns | 0.65 | 0.07 |
'Array access using 2D array' | 32 | 346.6 ns | 9.225 ns | 26.91 ns | 1.00 | 0.00 |
@ -19,7 +19,6 @@ namespace SixLabors.ImageSharp.Benchmarks.General
*
*/
public class Array2D
{
private float[] flatArray;
@ -34,6 +33,7 @@ namespace SixLabors.ImageSharp.Benchmarks.General
public int Count { get; set; }
public int Min { get; private set; }
public int Max { get; private set; }
[GlobalSetup]
@ -65,11 +65,12 @@ namespace SixLabors.ImageSharp.Benchmarks.General
{
for (int j = this.Min; j < this.Max; j++)
{
ref float v = ref a[count * i + j];
ref float v = ref a[(count * i) + j];
v = i * j;
s += v;
}
}
return s;
}
@ -87,6 +88,7 @@ namespace SixLabors.ImageSharp.Benchmarks.General
s += v;
}
}
return s;
}
@ -104,6 +106,7 @@ namespace SixLabors.ImageSharp.Benchmarks.General
s += v;
}
}
return s;
}
@ -121,7 +124,8 @@ namespace SixLabors.ImageSharp.Benchmarks.General
s += v;
}
}
return s;
}
}
}
}

21
tests/ImageSharp.Benchmarks/General/ArrayReverse.cs

@ -1,4 +1,4 @@
// Copyright (c) Six Labors and contributors.
// Copyright (c) Six Labors and contributors.
// Licensed under the Apache License, Version 2.0.
using System;
@ -12,9 +12,9 @@ namespace SixLabors.ImageSharp.Benchmarks.General
[Params(4, 16, 32)]
public int Count { get; set; }
byte[] source;
private byte[] source;
byte[] destination;
private byte[] destination;
[GlobalSetup]
public void SetUp()
@ -34,12 +34,13 @@ namespace SixLabors.ImageSharp.Benchmarks.General
{
this.ReverseBytes(this.source, 0, this.Count);
//for (int i = 0; i < this.source.Length / 2; i++)
//{
// byte tmp = this.source[i];
// this.source[i] = this.source[this.source.Length - i - 1];
// this.source[this.source.Length - i - 1] = tmp;
//}
/*
for (int i = 0; i < this.source.Length / 2; i++)
{
byte tmp = this.source[i];
this.source[i] = this.source[this.source.Length - i - 1];
this.source[this.source.Length - i - 1] = tmp;
}*/
}
public void ReverseBytes(byte[] source, int index, int length)
@ -56,4 +57,4 @@ namespace SixLabors.ImageSharp.Benchmarks.General
}
}
}
}
}

5
tests/ImageSharp.Benchmarks/General/BasicMath/Abs.cs

@ -1,4 +1,7 @@
using System;
// Copyright (c) Six Labors and contributors.
// Licensed under the Apache License, Version 2.0.
using System;
using BenchmarkDotNet.Attributes;

8
tests/ImageSharp.Benchmarks/General/BasicMath/ClampFloat.cs

@ -1,4 +1,7 @@
using System;
// Copyright (c) Six Labors and contributors.
// Licensed under the Apache License, Version 2.0.
using System;
using System.Runtime.CompilerServices;
using BenchmarkDotNet.Attributes;
@ -37,7 +40,6 @@ namespace SixLabors.ImageSharp.Benchmarks.General.BasicMath
return acc;
}
[MethodImpl(MethodImplOptions.AggressiveInlining)]
private static float ClampUsingMathF(float x, float min, float max)
{
@ -66,4 +68,4 @@ namespace SixLabors.ImageSharp.Benchmarks.General.BasicMath
// UsingMathF | 30.37 ns | 0.3764 ns | 0.3337 ns | 1.00 |
// UsingBranching | 18.66 ns | 0.1043 ns | 0.0871 ns | 0.61 |
}
}
}

7
tests/ImageSharp.Benchmarks/General/BasicMath/ModuloPowerOfTwoConstant.cs

@ -1,4 +1,7 @@
using BenchmarkDotNet.Attributes;
// Copyright (c) Six Labors and contributors.
// Licensed under the Apache License, Version 2.0.
using BenchmarkDotNet.Attributes;
namespace SixLabors.ImageSharp.Benchmarks.General.BasicMath
{
@ -19,4 +22,4 @@ namespace SixLabors.ImageSharp.Benchmarks.General.BasicMath
return ImageMaths.Modulo8(this.value);
}
}
}
}

7
tests/ImageSharp.Benchmarks/General/BasicMath/ModuloPowerOfTwoVariable.cs

@ -1,4 +1,7 @@
using BenchmarkDotNet.Attributes;
// Copyright (c) Six Labors and contributors.
// Licensed under the Apache License, Version 2.0.
using BenchmarkDotNet.Attributes;
namespace SixLabors.ImageSharp.Benchmarks.General.BasicMath
{
@ -28,4 +31,4 @@ namespace SixLabors.ImageSharp.Benchmarks.General.BasicMath
// Standard | 1.2465 ns | 0.0093 ns | 0.0455 ns | 1.2423 ns | 1.00 | 0.00 |
// Bitwise | 0.0265 ns | 0.0103 ns | 0.0515 ns | 0.0000 ns | 0.02 | 0.04 |
}
}
}

6
tests/ImageSharp.Benchmarks/General/BasicMath/Pow.cs

@ -1,4 +1,7 @@
using System;
// Copyright (c) Six Labors and contributors.
// Licensed under the Apache License, Version 2.0.
using System;
using BenchmarkDotNet.Attributes;
@ -9,7 +12,6 @@ namespace SixLabors.ImageSharp.Benchmarks.General.BasicMath
[Params(-1.333F, 1.333F)]
public float X { get; set; }
[Benchmark(Baseline = true, Description = "Math.Pow 2")]
public float MathPow()
{

11
tests/ImageSharp.Benchmarks/General/BasicMath/Round.cs

@ -1,17 +1,20 @@
using System;
// Copyright (c) Six Labors and contributors.
// Licensed under the Apache License, Version 2.0.
using System;
using BenchmarkDotNet.Attributes;
namespace SixLabors.ImageSharp.Benchmarks.General.BasicMath
{
public class Round
{
private const float input = .51F;
private const float Input = .51F;
[Benchmark]
public int ConvertTo() => Convert.ToInt32(input);
public int ConvertTo() => Convert.ToInt32(Input);
[Benchmark]
public int MathRound() => (int)Math.Round(input);
public int MathRound() => (int)Math.Round(Input);
// Results 20th Jan 2019
// Method | Mean | Error | StdDev | Median |

2
tests/ImageSharp.Benchmarks/General/CopyBuffers.cs

@ -34,7 +34,6 @@ namespace SixLabors.ImageSharp.Benchmarks.General
[Params(10, 50, 100, 1000, 10000)]
public int Count { get; set; }
[GlobalSetup]
public void Setup()
{
@ -74,7 +73,6 @@ namespace SixLabors.ImageSharp.Benchmarks.General
Buffer.MemoryCopy(pinnedSource, pinnedDestination, this.Count, this.Count);
}
[Benchmark(Description = "Marshal.Copy()")]
public unsafe void MarshalCopy()
{

9
tests/ImageSharp.Benchmarks/General/PixelConversion/ITestPixel.cs

@ -1,10 +1,13 @@
using System.Numerics;
// Copyright (c) Six Labors and contributors.
// Licensed under the Apache License, Version 2.0.
using System.Numerics;
using SixLabors.ImageSharp.PixelFormats;
namespace SixLabors.ImageSharp.Benchmarks.General.PixelConversion
{
interface ITestPixel<T>
public interface ITestPixel<T>
where T : struct, ITestPixel<T>
{
void FromRgba32(Rgba32 source);
@ -25,4 +28,4 @@ namespace SixLabors.ImageSharp.Benchmarks.General.PixelConversion
void CopyToVector4(ref Vector4 dest);
}
}
}

121
tests/ImageSharp.Benchmarks/General/PixelConversion/PixelConversion_ConvertFromRgba32.cs

@ -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[] dest;
public readonly T[] Dest;
public readonly Rgba32[] source;
public readonly Rgba32[] Source;
public ConversionRunner(int count)
{
this.dest = new T[count];
this.source = new Rgba32[count];
this.Dest = new T[count];
this.Source = new Rgba32[count];
}
[MethodImpl(MethodImplOptions.AggressiveInlining)]
public void RunByRefConversion()
{
int count = this.dest.Length;
int count = this.Dest.Length;
ref T destBaseRef = ref this.dest[0];
ref Rgba32 sourceBaseRef = ref this.source[0];
ref T destBaseRef = ref this.Dest[0];
ref Rgba32 sourceBaseRef = ref this.Source[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.dest.Length;
int count = this.Dest.Length;
ref T destBaseRef = ref this.dest[0];
ref Rgba32 sourceBaseRef = ref this.source[0];
ref T destBaseRef = ref this.Dest[0];
ref Rgba32 sourceBaseRef = ref this.Source[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.dest.Length;
int count = this.Dest.Length;
ref T destBaseRef = ref this.dest[0];
ref Rgba32 sourceBaseRef = ref this.source[0];
ref T destBaseRef = ref this.Dest[0];
ref Rgba32 sourceBaseRef = ref this.Source[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(
256,
2048
)]
internal ConversionRunner<TestArgb> PermutedRunnerRgbaToArgb;
[Params(256, 2048)]
public int Count { get; set; }
[GlobalSetup]
public void Setup()
{
this.compatibleMemLayoutRunner = new ConversionRunner<TestRgba>(this.Count);
this.permutedRunnerRgbaToArgb = new ConversionRunner<TestArgb>(this.Count);
this.CompatibleMemLayoutRunner = new ConversionRunner<TestRgba>(this.Count);
this.PermutedRunnerRgbaToArgb = new ConversionRunner<TestArgb>(this.Count);
}
}
@ -93,26 +92,26 @@ namespace SixLabors.ImageSharp.Benchmarks.General.PixelConversion
[Benchmark(Baseline = true)]
public void ByRef()
{
this.compatibleMemLayoutRunner.RunByRefConversion();
this.CompatibleMemLayoutRunner.RunByRefConversion();
}
[Benchmark]
public void ByVal()
{
this.compatibleMemLayoutRunner.RunByValConversion();
this.CompatibleMemLayoutRunner.RunByValConversion();
}
[Benchmark]
public void FromBytes()
{
this.compatibleMemLayoutRunner.RunFromBytesConversion();
this.CompatibleMemLayoutRunner.RunFromBytesConversion();
}
[Benchmark]
public void Inline()
{
ref Rgba32 sBase = ref this.compatibleMemLayoutRunner.source[0];
ref Rgba32 dBase = ref Unsafe.As<TestRgba, Rgba32>(ref this.compatibleMemLayoutRunner.dest[0]);
ref Rgba32 sBase = ref this.CompatibleMemLayoutRunner.Source[0];
ref Rgba32 dBase = ref Unsafe.As<TestRgba, Rgba32>(ref this.CompatibleMemLayoutRunner.Dest[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 | 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 | */
}
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.permutedRunnerRgbaToArgb.RunByRefConversion();
this.PermutedRunnerRgbaToArgb.RunByRefConversion();
}
[Benchmark]
public void ByVal()
{
this.permutedRunnerRgbaToArgb.RunByValConversion();
this.PermutedRunnerRgbaToArgb.RunByValConversion();
}
[Benchmark]
public void FromBytes()
{
this.permutedRunnerRgbaToArgb.RunFromBytesConversion();
this.PermutedRunnerRgbaToArgb.RunFromBytesConversion();
}
[Benchmark]
public void InlineShuffle()
{
ref Rgba32 sBase = ref this.permutedRunnerRgbaToArgb.source[0];
ref TestArgb dBase = ref this.permutedRunnerRgbaToArgb.dest[0];
ref Rgba32 sBase = ref this.PermutedRunnerRgbaToArgb.Source[0];
ref TestArgb dBase = ref this.PermutedRunnerRgbaToArgb.Dest[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.source[0]);
ref uint dBase = ref Unsafe.As<TestArgb, uint>(ref this.permutedRunnerRgbaToArgb.dest[0]);
ref uint sBase = ref Unsafe.As<Rgba32, uint>(ref this.PermutedRunnerRgbaToArgb.Source[0]);
ref uint dBase = ref Unsafe.As<TestArgb, uint>(ref this.PermutedRunnerRgbaToArgb.Dest[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.source);
Span<uint> dest = MemoryMarshal.Cast<TestArgb, uint>(this.permutedRunnerRgbaToArgb.dest);
Span<uint> source = MemoryMarshal.Cast<Rgba32, uint>(this.PermutedRunnerRgbaToArgb.Source);
Span<uint> dest = MemoryMarshal.Cast<TestArgb, uint>(this.PermutedRunnerRgbaToArgb.Dest);
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 | 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 |
*/
}
}
}

19
tests/ImageSharp.Benchmarks/General/PixelConversion/PixelConversion_ConvertFromVector4.cs

@ -1,4 +1,5 @@
// ReSharper disable InconsistentNaming
// Copyright (c) Six Labors and contributors.
// Licensed under the Apache License, Version 2.0.
using System.Numerics;
using System.Runtime.CompilerServices;
@ -8,12 +9,13 @@ using BenchmarkDotNet.Attributes;
using SixLabors.ImageSharp.PixelFormats;
// ReSharper disable InconsistentNaming
namespace SixLabors.ImageSharp.Benchmarks.General.PixelConversion
{
public class PixelConversion_ConvertFromVector4
{
[StructLayout(LayoutKind.Sequential)]
struct TestRgbaVector : ITestPixel<TestRgbaVector>
private struct TestRgbaVector : ITestPixel<TestRgbaVector>
{
private Vector4 v;
@ -39,13 +41,17 @@ namespace SixLabors.ImageSharp.Benchmarks.General.PixelConversion
}
public void FromRgba32(Rgba32 source) => throw new System.NotImplementedException();
public void FromRgba32(ref Rgba32 source) => throw new System.NotImplementedException();
public void FromBytes(byte r, byte g, byte b, byte a) => throw new System.NotImplementedException();
public Rgba32 ToRgba32() => throw new System.NotImplementedException();
public void CopyToRgba32(ref Rgba32 dest) => throw new System.NotImplementedException();
}
struct ConversionRunner<T>
private struct ConversionRunner<T>
where T : struct, ITestPixel<T>
{
private T[] dest;
@ -100,7 +106,7 @@ namespace SixLabors.ImageSharp.Benchmarks.General.PixelConversion
this.nonVectorRunner = new ConversionRunner<TestArgb>(this.Count);
this.vectorRunner = new ConversionRunner<TestRgbaVector>(this.Count);
}
[Benchmark(Baseline = true)]
public void VectorByRef()
{
@ -124,7 +130,6 @@ namespace SixLabors.ImageSharp.Benchmarks.General.PixelConversion
{
this.nonVectorRunner.RunByValConversion();
}
}
/*
@ -135,8 +140,8 @@ namespace SixLabors.ImageSharp.Benchmarks.General.PixelConversion
* VectorByVal | 32 | 24.5347 ns | 0.0771 ns | 1.04 | 0.01 |
* NonVectorByRef | 32 | 59.0187 ns | 0.2114 ns | 2.49 | 0.01 |
* NonVectorByVal | 32 | 58.7529 ns | 0.2545 ns | 2.48 | 0.02 |
*
*
* !!! Conclusion !!!
* We do not need by-ref version of ConvertFromVector4() stuff
*/
}
}

13
tests/ImageSharp.Benchmarks/General/PixelConversion/PixelConversion_ConvertToRgba32.cs

@ -1,4 +1,7 @@
using System.Runtime.CompilerServices;
// Copyright (c) Six Labors and contributors.
// Licensed under the Apache License, Version 2.0.
using System.Runtime.CompilerServices;
using BenchmarkDotNet.Attributes;
@ -8,14 +11,14 @@ namespace SixLabors.ImageSharp.Benchmarks.General.PixelConversion
{
/// <summary>
/// When implementing TPixel --> Rgba32 style conversions on IPixel, should which API should we prefer?
/// 1. Rgba32 ToRgba32();
/// 1. Rgba32 ToRgba32();
/// OR
/// 2. void CopyToRgba32(ref Rgba32 dest);
/// ?
/// </summary>
public class PixelConversion_ConvertToRgba32
{
struct ConversionRunner<T>
private struct ConversionRunner<T>
where T : struct, ITestPixel<T>
{
private T[] source;
@ -98,7 +101,7 @@ namespace SixLabors.ImageSharp.Benchmarks.General.PixelConversion
/*
* Results:
*
*
* Method | Count | Mean | StdDev | Scaled | Scaled-StdDev |
* --------------- |------ |------------ |---------- |------- |-------------- |
* CompatibleRetval | 128 | 89.7358 ns | 2.2389 ns | 1.00 | 0.00 |
@ -106,4 +109,4 @@ namespace SixLabors.ImageSharp.Benchmarks.General.PixelConversion
* PermutedRetval | 128 | 845.4038 ns | 5.6154 ns | 9.43 | 0.23 |
* PermutedCopyTo | 128 | 155.6004 ns | 3.8870 ns | 1.73 | 0.06 |
*/
}
}

9
tests/ImageSharp.Benchmarks/General/PixelConversion/PixelConversion_ConvertToRgba32_AsPartOfCompositeOperation.cs

@ -1,4 +1,7 @@
using System.Runtime.CompilerServices;
// Copyright (c) Six Labors and contributors.
// Licensed under the Apache License, Version 2.0.
using System.Runtime.CompilerServices;
using BenchmarkDotNet.Attributes;
@ -8,7 +11,7 @@ namespace SixLabors.ImageSharp.Benchmarks.General.PixelConversion
{
public class PixelConversion_ConvertToRgba32_AsPartOfCompositeOperation
{
struct ConversionRunner<T>
private struct ConversionRunner<T>
where T : struct, ITestPixel<T>
{
private T[] source;
@ -110,4 +113,4 @@ namespace SixLabors.ImageSharp.Benchmarks.General.PixelConversion
// CompatibleCopyTo | 32 | 36.12 ns | 0.3596 ns | 0.3003 ns | 0.68 | 0.01 |
// PermutedRetval | 32 | 303.61 ns | 5.1697 ns | 4.8358 ns | 5.72 | 0.09 |
// PermutedCopyTo | 32 | 38.05 ns | 0.8053 ns | 1.2297 ns | 0.72 | 0.02 |
}
}

9
tests/ImageSharp.Benchmarks/General/PixelConversion/PixelConversion_ConvertToVector4.cs

@ -1,4 +1,7 @@
using System.Numerics;
// Copyright (c) Six Labors and contributors.
// Licensed under the Apache License, Version 2.0.
using System.Numerics;
using System.Runtime.CompilerServices;
using BenchmarkDotNet.Attributes;
@ -7,7 +10,7 @@ namespace SixLabors.ImageSharp.Benchmarks.General.PixelConversion
{
public class PixelConversion_ConvertToVector4
{
struct ConversionRunner<T>
private struct ConversionRunner<T>
where T : struct, ITestPixel<T>
{
private T[] source;
@ -78,4 +81,4 @@ namespace SixLabors.ImageSharp.Benchmarks.General.PixelConversion
// UseRetval | 32 | 109.0 ns | 1.202 ns | 1.125 ns | 1.00 |
// UseCopyTo | 32 | 108.6 ns | 1.151 ns | 1.020 ns | 1.00 |
}
}
}

9
tests/ImageSharp.Benchmarks/General/PixelConversion/PixelConversion_ConvertToVector4_AsPartOfCompositeOperation.cs

@ -1,4 +1,7 @@
using System.Numerics;
// Copyright (c) Six Labors and contributors.
// Licensed under the Apache License, Version 2.0.
using System.Numerics;
using System.Runtime.CompilerServices;
using BenchmarkDotNet.Attributes;
@ -7,7 +10,7 @@ namespace SixLabors.ImageSharp.Benchmarks.General.PixelConversion
{
public class PixelConversion_ConvertToVector4_AsPartOfCompositeOperation
{
struct ConversionRunner<T>
private struct ConversionRunner<T>
where T : struct, ITestPixel<T>
{
private T[] source;
@ -92,4 +95,4 @@ namespace SixLabors.ImageSharp.Benchmarks.General.PixelConversion
// UseRetval | 32 | 120.2 ns | 1.560 ns | 1.383 ns | 1.00 | 0.00 |
// UseCopyTo | 32 | 121.7 ns | 2.439 ns | 2.281 ns | 1.01 | 0.02 |
}
}
}

12
tests/ImageSharp.Benchmarks/General/PixelConversion/PixelConversion_Rgba32_To_Argb32.cs

@ -1,4 +1,7 @@
using System;
// Copyright (c) Six Labors and contributors.
// Licensed under the Apache License, Version 2.0.
using System;
using System.Runtime.CompilerServices;
using System.Runtime.InteropServices;
@ -74,7 +77,6 @@ namespace SixLabors.ImageSharp.Benchmarks.General.PixelConversion
}
}
[Benchmark]
public void Default_Group4()
{
@ -98,7 +100,7 @@ namespace SixLabors.ImageSharp.Benchmarks.General.PixelConversion
Unsafe.Add(ref d2, 1).FromRgba32(s3);
}
}
[Benchmark]
public void BitOps()
{
@ -137,6 +139,7 @@ namespace SixLabors.ImageSharp.Benchmarks.General.PixelConversion
/// <summary>
/// Converts a packed <see cref="Rgba32"/> to <see cref="Argb32"/>.
/// </summary>
/// <returns>The argb value.</returns>
[MethodImpl(InliningOptions.ShortMethod)]
public static uint ToArgb32(uint packedRgba)
{
@ -148,6 +151,7 @@ namespace SixLabors.ImageSharp.Benchmarks.General.PixelConversion
/// <summary>
/// Converts a packed <see cref="Rgba32"/> to <see cref="Bgra32"/>.
/// </summary>
/// <returns>The bgra value.</returns>
[MethodImpl(InliningOptions.ShortMethod)]
public static uint ToBgra32(uint packedRgba)
{
@ -173,4 +177,4 @@ namespace SixLabors.ImageSharp.Benchmarks.General.PixelConversion
// BitOps | 64 | 39.25 ns | 0.3266 ns | 0.2895 ns | 0.37 |
// BitOps_GroupAsULong | 64 | 41.80 ns | 0.2227 ns | 0.2083 ns | 0.39 |
}
}
}

84
tests/ImageSharp.Benchmarks/General/PixelConversion/PixelConversion_Rgba32_To_Bgra32.cs

@ -1,3 +1,6 @@
// Copyright (c) Six Labors and contributors.
// Licensed under the Apache License, Version 2.0.
using System;
using System.Numerics;
using System.Runtime.CompilerServices;
@ -10,8 +13,8 @@ using SixLabors.ImageSharp.Tuples;
namespace SixLabors.ImageSharp.Benchmarks.General.PixelConversion
{
//[MonoJob]
//[RyuJitX64Job]
// [MonoJob]
// [RyuJitX64Job]
public class PixelConversion_Rgba32_To_Bgra32
{
private Rgba32[] source;
@ -19,19 +22,22 @@ namespace SixLabors.ImageSharp.Benchmarks.General.PixelConversion
private Bgra32[] dest;
[StructLayout(LayoutKind.Sequential)]
struct Tuple4OfUInt32
private struct Tuple4OfUInt32
{
public uint V0, V1, V2, V3;
private uint v0;
private uint v1;
private uint v2;
private uint v3;
public void ConvertMe()
{
this.V0 = FromRgba32.ToBgra32(this.V0);
this.V1 = FromRgba32.ToBgra32(this.V1);
this.V2 = FromRgba32.ToBgra32(this.V2);
this.V3 = FromRgba32.ToBgra32(this.V3);
this.v0 = FromRgba32.ToBgra32(this.v0);
this.v1 = FromRgba32.ToBgra32(this.v1);
this.v2 = FromRgba32.ToBgra32(this.v2);
this.v3 = FromRgba32.ToBgra32(this.v3);
}
}
[Params(64)]
public int Count { get; set; }
@ -81,7 +87,7 @@ namespace SixLabors.ImageSharp.Benchmarks.General.PixelConversion
ref Rgba32 sBase = ref this.source[0];
ref Bgra32 dBase = ref this.dest[0];
for (int i = 0; i < this.Count; i+=2)
for (int i = 0; i < this.Count; i += 2)
{
ref Rgba32 s0 = ref Unsafe.Add(ref sBase, i);
Rgba32 s1 = Unsafe.Add(ref s0, 1);
@ -115,7 +121,7 @@ namespace SixLabors.ImageSharp.Benchmarks.General.PixelConversion
Unsafe.Add(ref d2, 1).FromRgba32(s3);
}
}
[MethodImpl(MethodImplOptions.NoInlining)]
private static void Group4GenericImpl<TPixel>(ReadOnlySpan<Rgba32> source, Span<TPixel> dest)
where TPixel : struct, IPixel<TPixel>
@ -141,13 +147,13 @@ namespace SixLabors.ImageSharp.Benchmarks.General.PixelConversion
}
}
//[Benchmark]
// [Benchmark]
public void Default_Group4_Generic()
{
Group4GenericImpl(this.source.AsSpan(), this.dest.AsSpan());
}
//[Benchmark]
// [Benchmark]
public void Default_Group8()
{
ref Rgba32 sBase = ref this.source[0];
@ -174,7 +180,6 @@ namespace SixLabors.ImageSharp.Benchmarks.General.PixelConversion
ref Bgra32 d5 = ref Unsafe.Add(ref d4, 1);
ref Bgra32 d6 = ref Unsafe.Add(ref d5, 1);
d0.FromRgba32(s0);
d1.FromRgba32(s1);
d2.FromRgba32(s2);
@ -214,7 +219,7 @@ namespace SixLabors.ImageSharp.Benchmarks.General.PixelConversion
}
}
//[Benchmark]
// [Benchmark]
public void Bitops_SingleTuple()
{
ref Tuple4OfUInt32 sBase = ref Unsafe.As<Rgba32, Tuple4OfUInt32>(ref this.source[0]);
@ -225,7 +230,7 @@ namespace SixLabors.ImageSharp.Benchmarks.General.PixelConversion
}
}
//[Benchmark]
// [Benchmark]
public void Bitops_Simd()
{
ref Octet.OfUInt32 sBase = ref Unsafe.As<Rgba32, Octet.OfUInt32>(ref this.source[0]);
@ -238,15 +243,29 @@ namespace SixLabors.ImageSharp.Benchmarks.General.PixelConversion
}
[StructLayout(LayoutKind.Sequential)]
struct B
private struct B
{
public uint tmp2, tmp5, tmp8, tmp11, tmp14, tmp17, tmp20, tmp23;
public uint Tmp2;
public uint Tmp5;
public uint Tmp8;
public uint Tmp11;
public uint Tmp14;
public uint Tmp17;
public uint Tmp20;
public uint Tmp23;
}
[StructLayout(LayoutKind.Sequential)]
struct C
private struct C
{
public uint tmp3, tmp6, tmp9, tmp12, tmp15, tmp18, tmp21, tmp24;
public uint Tmp3;
public uint Tmp6;
public uint Tmp9;
public uint Tmp12;
public uint Tmp15;
public uint Tmp18;
public uint Tmp21;
public uint Tmp24;
}
[MethodImpl(MethodImplOptions.AggressiveInlining)]
@ -263,14 +282,14 @@ namespace SixLabors.ImageSharp.Benchmarks.General.PixelConversion
C c = default;
c.tmp3 = (b.tmp2 << 16) | (b.tmp2 >> 16);
c.tmp6 = (b.tmp5 << 16) | (b.tmp5 >> 16);
c.tmp9 = (b.tmp8 << 16) | (b.tmp8 >> 16);
c.tmp12 = (b.tmp11 << 16) | (b.tmp11 >> 16);
c.tmp15 = (b.tmp14 << 16) | (b.tmp14 >> 16);
c.tmp18 = (b.tmp17 << 16) | (b.tmp17 >> 16);
c.tmp21 = (b.tmp20 << 16) | (b.tmp20 >> 16);
c.tmp24 = (b.tmp23 << 16) | (b.tmp23 >> 16);
c.Tmp3 = (b.Tmp2 << 16) | (b.Tmp2 >> 16);
c.Tmp6 = (b.Tmp5 << 16) | (b.Tmp5 >> 16);
c.Tmp9 = (b.Tmp8 << 16) | (b.Tmp8 >> 16);
c.Tmp12 = (b.Tmp11 << 16) | (b.Tmp11 >> 16);
c.Tmp15 = (b.Tmp14 << 16) | (b.Tmp14 >> 16);
c.Tmp18 = (b.Tmp17 << 16) | (b.Tmp17 >> 16);
c.Tmp21 = (b.Tmp20 << 16) | (b.Tmp20 >> 16);
c.Tmp24 = (b.Tmp23 << 16) | (b.Tmp23 >> 16);
Vector<uint> cc = Unsafe.As<C, Vector<uint>>(ref c);
Vector<uint> dd = aa + cc;
@ -278,7 +297,7 @@ namespace SixLabors.ImageSharp.Benchmarks.General.PixelConversion
d = Unsafe.As<Vector<uint>, Octet.OfUInt32>(ref dd);
}
//[Benchmark]
// [Benchmark]
public void BitOps_Group2()
{
ref uint sBase = ref Unsafe.As<Rgba32, uint>(ref this.source[0]);
@ -294,7 +313,7 @@ namespace SixLabors.ImageSharp.Benchmarks.General.PixelConversion
Unsafe.Add(ref d0, 1) = FromRgba32.ToBgra32(s1);
}
}
[Benchmark]
public void BitOps_GroupAsULong()
{
@ -315,7 +334,7 @@ namespace SixLabors.ImageSharp.Benchmarks.General.PixelConversion
}
}
//[Benchmark]
// [Benchmark]
public void BitOps_GroupAsULong_V2()
{
ref ulong sBase = ref Unsafe.As<Rgba32, ulong>(ref this.source[0]);
@ -350,6 +369,7 @@ namespace SixLabors.ImageSharp.Benchmarks.General.PixelConversion
/// <summary>
/// Converts a packed <see cref="Rgba32"/> to <see cref="Argb32"/>.
/// </summary>
/// <returns>The argb value.</returns>
[MethodImpl(InliningOptions.ShortMethod)]
public static uint ToArgb32(uint packedRgba)
{
@ -361,6 +381,7 @@ namespace SixLabors.ImageSharp.Benchmarks.General.PixelConversion
/// <summary>
/// Converts a packed <see cref="Rgba32"/> to <see cref="Bgra32"/>.
/// </summary>
/// <returns>The bgra value.</returns>
[MethodImpl(InliningOptions.ShortMethod)]
public static uint ToBgra32(uint packedRgba)
{
@ -376,7 +397,6 @@ namespace SixLabors.ImageSharp.Benchmarks.General.PixelConversion
}
}
// RESULTS:
// Method | Count | Mean | Error | StdDev | Scaled | ScaledSD |
// -------------------- |------ |---------:|----------:|----------:|-------:|---------:|

14
tests/ImageSharp.Benchmarks/General/PixelConversion/TestArgb.cs

@ -1,4 +1,7 @@
using System.Numerics;
// Copyright (c) Six Labors and contributors.
// Licensed under the Apache License, Version 2.0.
using System.Numerics;
using System.Runtime.CompilerServices;
using System.Runtime.InteropServices;
@ -7,9 +10,12 @@ using SixLabors.ImageSharp.PixelFormats;
namespace SixLabors.ImageSharp.Benchmarks.General.PixelConversion
{
[StructLayout(LayoutKind.Sequential)]
struct TestArgb : ITestPixel<TestArgb>
public struct TestArgb : ITestPixel<TestArgb>
{
public byte A, R, G, B;
public byte A;
public byte R;
public byte G;
public byte B;
[MethodImpl(MethodImplOptions.AggressiveInlining)]
public void FromRgba32(Rgba32 p)
@ -86,4 +92,4 @@ namespace SixLabors.ImageSharp.Benchmarks.General.PixelConversion
dest.W = this.A;
}
}
}
}

16
tests/ImageSharp.Benchmarks/General/PixelConversion/TestRgba.cs

@ -1,4 +1,7 @@
using System.Numerics;
// Copyright (c) Six Labors and contributors.
// Licensed under the Apache License, Version 2.0.
using System.Numerics;
using System.Runtime.CompilerServices;
using System.Runtime.InteropServices;
@ -7,9 +10,12 @@ using SixLabors.ImageSharp.PixelFormats;
namespace SixLabors.ImageSharp.Benchmarks.General.PixelConversion
{
[StructLayout(LayoutKind.Sequential)]
struct TestRgba : ITestPixel<TestRgba>
public struct TestRgba : ITestPixel<TestRgba>
{
public byte R, G, B, A;
public byte R;
public byte G;
public byte B;
public byte A;
[MethodImpl(MethodImplOptions.AggressiveInlining)]
public void FromRgba32(Rgba32 source)
@ -57,7 +63,7 @@ namespace SixLabors.ImageSharp.Benchmarks.General.PixelConversion
[MethodImpl(MethodImplOptions.AggressiveInlining)]
public Vector4 ToVector4()
{
return new Vector4(this.R, this.G, this.B, this.A) * new Vector4(1f / 255f);
return new Vector4(this.R, this.G, this.B, this.A) * new Vector4(1f / 255f);
}
[MethodImpl(MethodImplOptions.AggressiveInlining)]
@ -68,4 +74,4 @@ namespace SixLabors.ImageSharp.Benchmarks.General.PixelConversion
dest = tmp;
}
}
}
}

5
tests/ImageSharp.Benchmarks/General/StructCasting.cs

@ -1,4 +1,7 @@
using System.Runtime.CompilerServices;
// Copyright (c) Six Labors and contributors.
// Licensed under the Apache License, Version 2.0.
using System.Runtime.CompilerServices;
using BenchmarkDotNet.Attributes;
namespace SixLabors.ImageSharp.Benchmarks.General

22
tests/ImageSharp.Benchmarks/General/Vector4Constants.cs

@ -1,3 +1,6 @@
// Copyright (c) Six Labors and contributors.
// Licensed under the Apache License, Version 2.0.
using System;
using System.Numerics;
@ -28,8 +31,7 @@ namespace SixLabors.ImageSharp.Benchmarks.General
this.GetRandomFloat(),
this.GetRandomFloat(),
this.GetRandomFloat(),
this.GetRandomFloat()
);
this.GetRandomFloat());
}
[Benchmark(Baseline = true)]
@ -37,10 +39,10 @@ namespace SixLabors.ImageSharp.Benchmarks.General
{
Vector4 p = this.parameter;
Vector4 x = p * A / B + p * C / D;
Vector4 y = p / A * B + p / C * D;
Vector4 z = Vector4.Min(p, A);
Vector4 w = Vector4.Max(p, B);
Vector4 x = (p * A / B) + (p * C / D);
Vector4 y = (p / A * B) + (p / C * D);
var z = Vector4.Min(p, A);
var w = Vector4.Max(p, B);
return x + y + z + w;
}
@ -49,10 +51,10 @@ namespace SixLabors.ImageSharp.Benchmarks.General
{
Vector4 p = this.parameter;
Vector4 x = p * new Vector4(1.2f) / new Vector4(2.3f) + p * new Vector4(4.5f) / new Vector4(6.7f);
Vector4 y = p / new Vector4(1.2f) * new Vector4(2.3f) + p / new Vector4(4.5f) * new Vector4(6.7f);
Vector4 z = Vector4.Min(p, new Vector4(1.2f));
Vector4 w = Vector4.Max(p, new Vector4(2.3f));
Vector4 x = (p * new Vector4(1.2f) / new Vector4(2.3f)) + (p * new Vector4(4.5f) / new Vector4(6.7f));
Vector4 y = (p / new Vector4(1.2f) * new Vector4(2.3f)) + (p / new Vector4(4.5f) * new Vector4(6.7f));
var z = Vector4.Min(p, new Vector4(1.2f));
var w = Vector4.Max(p, new Vector4(2.3f));
return x + y + z + w;
}

7
tests/ImageSharp.Benchmarks/General/Vectorization/BitwiseOrUint32.cs

@ -1,3 +1,6 @@
// Copyright (c) Six Labors and contributors.
// Licensed under the Apache License, Version 2.0.
using System.Numerics;
using BenchmarkDotNet.Attributes;
@ -24,7 +27,7 @@ namespace SixLabors.ImageSharp.Benchmarks.General.Vectorization
for (int i = 0; i < this.InputSize; i++)
{
this.input[i] = (uint) i;
this.input[i] = (uint)i;
}
}
@ -43,7 +46,7 @@ namespace SixLabors.ImageSharp.Benchmarks.General.Vectorization
{
var v = new Vector<uint>(this.testValue);
for (int i = 0; i < this.input.Length; i+=Vector<uint>.Count)
for (int i = 0; i < this.input.Length; i += Vector<uint>.Count)
{
var a = new Vector<uint>(this.input, i);
a = Vector.BitwiseOr(a, v);

5
tests/ImageSharp.Benchmarks/General/Vectorization/DivFloat.cs

@ -1,3 +1,6 @@
// Copyright (c) Six Labors and contributors.
// Licensed under the Apache License, Version 2.0.
using System.Numerics;
using BenchmarkDotNet.Attributes;
@ -51,4 +54,4 @@ namespace SixLabors.ImageSharp.Benchmarks.General.Vectorization
}
}
}
}
}

5
tests/ImageSharp.Benchmarks/General/Vectorization/DivUInt32.cs

@ -1,3 +1,6 @@
// Copyright (c) Six Labors and contributors.
// Licensed under the Apache License, Version 2.0.
using System.Numerics;
using BenchmarkDotNet.Attributes;
@ -53,4 +56,4 @@ namespace SixLabors.ImageSharp.Benchmarks.General.Vectorization
}
}
}
}
}

9
tests/ImageSharp.Benchmarks/General/Vectorization/Divide.cs

@ -1,10 +1,15 @@
// Copyright (c) Six Labors and contributors.
// Licensed under the Apache License, Version 2.0.
using System.Numerics;
using BenchmarkDotNet.Attributes;
namespace ImageSharp.Benchmarks.General.Vectorization
{
#pragma warning disable SA1649 // File name should match first type name
public class DivFloat : SIMDBenchmarkBase<float>.Divide
#pragma warning restore SA1649 // File name should match first type name
{
protected override float GetTestValue() => 42;
@ -53,7 +58,7 @@ namespace ImageSharp.Benchmarks.General.Vectorization
{
protected override short GetTestValue() => 42;
protected override Vector<short> GetTestVector() => new Vector<short>(new short[] {1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15, 16, 17});
protected override Vector<short> GetTestVector() => new Vector<short>(new short[] { 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15, 16, 17 });
[Benchmark(Baseline = true)]
public void Standard()
@ -65,4 +70,4 @@ namespace ImageSharp.Benchmarks.General.Vectorization
}
}
}
}
}

3
tests/ImageSharp.Benchmarks/General/Vectorization/MulFloat.cs

@ -1,3 +1,6 @@
// Copyright (c) Six Labors and contributors.
// Licensed under the Apache License, Version 2.0.
using System.Numerics;
using BenchmarkDotNet.Attributes;

3
tests/ImageSharp.Benchmarks/General/Vectorization/MulUInt32.cs

@ -1,3 +1,6 @@
// Copyright (c) Six Labors and contributors.
// Licensed under the Apache License, Version 2.0.
using System.Numerics;
using BenchmarkDotNet.Attributes;

7
tests/ImageSharp.Benchmarks/General/Vectorization/Multiply.cs

@ -1,9 +1,14 @@
// Copyright (c) Six Labors and contributors.
// Licensed under the Apache License, Version 2.0.
using System.Numerics;
using BenchmarkDotNet.Attributes;
namespace ImageSharp.Benchmarks.General.Vectorization
{
#pragma warning disable SA1649 // File name should match first type name
public class MulUInt32 : SIMDBenchmarkBase<uint>.Multiply
#pragma warning restore SA1649 // File name should match first type name
{
protected override uint GetTestValue() => 42u;
@ -47,4 +52,4 @@ namespace ImageSharp.Benchmarks.General.Vectorization
}
}
}
}
}

7
tests/ImageSharp.Benchmarks/General/Vectorization/Premultiply.cs

@ -1,4 +1,7 @@
using System.Numerics;
// Copyright (c) Six Labors and contributors.
// Licensed under the Apache License, Version 2.0.
using System.Numerics;
using System.Runtime.CompilerServices;
using BenchmarkDotNet.Attributes;
@ -56,4 +59,4 @@ namespace SixLabors.ImageSharp.Benchmarks.General.Vectorization
source *= new Vector4(w) { W = 1 };
}
}
}
}

17
tests/ImageSharp.Benchmarks/General/Vectorization/ReinterpretUInt32AsFloat.cs

@ -1,3 +1,6 @@
// Copyright (c) Six Labors and contributors.
// Licensed under the Apache License, Version 2.0.
using System.Numerics;
using System.Runtime.InteropServices;
@ -15,22 +18,20 @@ namespace SixLabors.ImageSharp.Benchmarks.General.Vectorization
public int InputSize { get; set; }
[StructLayout(LayoutKind.Explicit)]
struct UIntFloatUnion
private struct UIntFloatUnion
{
[FieldOffset(0)]
public float f;
public float F;
[FieldOffset(0)]
public uint i;
public uint I;
}
[GlobalSetup]
public void Setup()
{
this.input = new uint[this.InputSize];
this.result = new float[this.InputSize];
for (int i = 0; i < this.InputSize; i++)
{
this.input[i] = (uint)i;
@ -43,8 +44,8 @@ namespace SixLabors.ImageSharp.Benchmarks.General.Vectorization
UIntFloatUnion u = default;
for (int i = 0; i < this.input.Length; i++)
{
u.i = this.input[i];
this.result[i] = u.f;
u.I = this.input[i];
this.result[i] = u.F;
}
}
@ -54,7 +55,7 @@ namespace SixLabors.ImageSharp.Benchmarks.General.Vectorization
for (int i = 0; i < this.input.Length; i += Vector<uint>.Count)
{
var a = new Vector<uint>(this.input, i);
Vector<float> b = Vector.AsVectorSingle(a);
var b = Vector.AsVectorSingle(a);
b.CopyTo(this.result, i);
}
}

7
tests/ImageSharp.Benchmarks/General/Vectorization/SIMDBenchmarkBase.cs

@ -1,3 +1,6 @@
// Copyright (c) Six Labors and contributors.
// Licensed under the Apache License, Version 2.0.
using System.Numerics;
using System.Runtime.CompilerServices;
@ -22,7 +25,7 @@ namespace ImageSharp.Benchmarks.General.Vectorization
[Params(32)]
public int InputSize { get; set; }
[GlobalSetup]
public virtual void Setup()
{
@ -63,7 +66,5 @@ namespace ImageSharp.Benchmarks.General.Vectorization
}
}
}
}
}

10
tests/ImageSharp.Benchmarks/General/Vectorization/UInt32ToSingle.cs

@ -1,3 +1,6 @@
// Copyright (c) Six Labors and contributors.
// Licensed under the Apache License, Version 2.0.
using System.Numerics;
using System.Runtime.CompilerServices;
@ -32,10 +35,6 @@ namespace SixLabors.ImageSharp.Benchmarks.General.Vectorization
for (int i = 0; i < n; i++)
{
// union { float f; uint32_t i; } u;
// u.f = 32768.0f + x * (255.0f / 256.0f);
// return (uint8_t)u.i;
ref Vector<float> df = ref Unsafe.Add(ref b, i);
var vi = Vector.AsVectorUInt32(df);
@ -67,7 +66,7 @@ namespace SixLabors.ImageSharp.Benchmarks.General.Vectorization
Unsafe.Add(ref bf, i) = v;
}
}
[Benchmark]
public void StandardSimdFromInt()
{
@ -87,7 +86,6 @@ namespace SixLabors.ImageSharp.Benchmarks.General.Vectorization
}
}
[Benchmark]
public void StandardSimdFromInt_RefCast()
{

7
tests/ImageSharp.Benchmarks/General/Vectorization/VectorFetching.cs

@ -1,3 +1,6 @@
// Copyright (c) Six Labors and contributors.
// Licensed under the Apache License, Version 2.0.
namespace SixLabors.ImageSharp.Benchmarks.General.Vectorization
{
using System;
@ -18,13 +21,13 @@ namespace SixLabors.ImageSharp.Benchmarks.General.Vectorization
[Params(64)]
public int InputSize { get; set; }
[GlobalSetup]
public void Setup()
{
this.data = new float[this.InputSize];
this.testValue = 42;
for (int i = 0; i < this.InputSize; i++)
{
this.data[i] = i;

7
tests/ImageSharp.Benchmarks/General/Vectorization/WidenBytesToUInt32.cs

@ -1,4 +1,7 @@
using System.Numerics;
// Copyright (c) Six Labors and contributors.
// Licensed under the Apache License, Version 2.0.
using System.Numerics;
using System.Runtime.CompilerServices;
using BenchmarkDotNet.Attributes;
@ -61,4 +64,4 @@ namespace SixLabors.ImageSharp.Benchmarks.General.Vectorization
}
}
}
}
}

10
tests/ImageSharp.Benchmarks/Samplers/Crop.cs

@ -1,14 +1,12 @@
// Copyright (c) Six Labors and contributors.
// Copyright (c) Six Labors and contributors.
// Licensed under the Apache License, Version 2.0.
using SixLabors.ImageSharp.PixelFormats;
using System.Drawing;
using System.Drawing.Drawing2D;
using BenchmarkDotNet.Attributes;
using SixLabors.ImageSharp.Processing;
using SixLabors.ImageSharp.PixelFormats;
using SixLabors.ImageSharp.Processing;
using CoreSize = SixLabors.Primitives.Size;
namespace SixLabors.ImageSharp.Benchmarks
@ -26,7 +24,7 @@ namespace SixLabors.ImageSharp.Benchmarks
graphics.PixelOffsetMode = PixelOffsetMode.HighQuality;
graphics.CompositingQuality = CompositingQuality.HighQuality;
graphics.DrawImage(source, new Rectangle(0, 0, 100, 100), 0, 0, 100, 100, GraphicsUnit.Pixel);
return destination.Size;
}
}

7
tests/ImageSharp.Benchmarks/Samplers/DetectEdges.cs

@ -1,4 +1,4 @@
// Copyright (c) Six Labors and contributors.
// Copyright (c) Six Labors and contributors.
// Licensed under the Apache License, Version 2.0.
using SixLabors.ImageSharp.PixelFormats;
@ -10,8 +10,7 @@ namespace SixLabors.ImageSharp.Benchmarks
using BenchmarkDotNet.Attributes;
using SixLabors.ImageSharp.Processing;
using CoreImage = ImageSharp.Image;
using CoreImage = SixLabors.ImageSharp.Image;
public class DetectEdges : BenchmarkBase
{
@ -51,4 +50,4 @@ namespace SixLabors.ImageSharp.Benchmarks
this.image.Mutate(x => x.DetectEdges(EdgeDetectionOperators.Sobel));
}
}
}
}

11
tests/ImageSharp.Benchmarks/Samplers/Diffuse.cs

@ -1,3 +1,6 @@
// Copyright (c) Six Labors and contributors.
// Licensed under the Apache License, Version 2.0.
using BenchmarkDotNet.Attributes;
using SixLabors.ImageSharp.PixelFormats;
using SixLabors.ImageSharp.Processing;
@ -26,11 +29,11 @@ namespace SixLabors.ImageSharp.Benchmarks.Samplers
// BenchmarkDotNet=v0.11.5, OS=Windows 10.0.18362
// Intel Core i7-8650U CPU 1.90GHz(Kaby Lake R), 1 CPU, 8 logical and 4 physical cores
// .NET Core SDK = 3.0.100
//
//
// [Host] : .NET Core 2.1.13 (CoreCLR 4.6.28008.01, CoreFX 4.6.28008.01), 64bit RyuJIT
// Clr : .NET Framework 4.7.2 (CLR 4.0.30319.42000), 64bit RyuJIT-v4.8.4018.0
// Core : .NET Core 2.1.13 (CoreCLR 4.6.28008.01, CoreFX 4.6.28008.01), 64bit RyuJIT
//
//
// IterationCount=3 LaunchCount=1 WarmupCount=3
//
// #### Before ####
@ -39,9 +42,9 @@ namespace SixLabors.ImageSharp.Benchmarks.Samplers
// |---------- |----- |-------- |----------:|---------:|---------:|------:|------:|------:|----------:|
// | DoDiffuse | Clr | Clr | 129.58 ms | 24.60 ms | 1.349 ms | - | - | - | 6 KB |
// | DoDiffuse | Core | Core | 92.63 ms | 89.78 ms | 4.921 ms | - | - | - | 4.58 KB |
//
//
// #### After ####
//
//
// | Method | Job | Runtime | Mean | Error | StdDev | Gen 0 | Gen 1 | Gen 2 | Allocated |
// |---------- |----- |-------- |----------:|----------:|----------:|------:|------:|------:|----------:|
// | DoDiffuse | Clr | Clr | 124.93 ms | 33.297 ms | 1.8251 ms | - | - | - | 2 KB |

3
tests/ImageSharp.Benchmarks/Samplers/GaussianBlur.cs

@ -1,3 +1,6 @@
// Copyright (c) Six Labors and contributors.
// Licensed under the Apache License, Version 2.0.
using BenchmarkDotNet.Attributes;
using SixLabors.ImageSharp.PixelFormats;
using SixLabors.ImageSharp.Processing;

39
tests/ImageSharp.Benchmarks/Samplers/Resize.cs

@ -1,4 +1,4 @@
// Copyright (c) Six Labors and contributors.
// Copyright (c) Six Labors and contributors.
// Licensed under the Apache License, Version 2.0.
using System.Drawing;
@ -14,7 +14,9 @@ using SixLabors.ImageSharp.Processing;
namespace SixLabors.ImageSharp.Benchmarks
{
[Config(typeof(Config.ShortClr))]
#pragma warning disable SA1649 // File name should match first type name
public abstract class ResizeBenchmarkBase<TPixel>
#pragma warning restore SA1649 // File name should match first type name
where TPixel : struct, IPixel<TPixel>
{
protected readonly Configuration Configuration = new Configuration(new JpegConfigurationModule());
@ -24,20 +26,18 @@ namespace SixLabors.ImageSharp.Benchmarks
private Bitmap sourceBitmap;
[Params("3032-400")]
public virtual string SourceToDest { get; set; }
public virtual string SourceToDest { get; set; }
protected int SourceSize { get; private set; }
protected int DestSize { get; private set; }
[GlobalSetup]
public virtual void Setup()
{
string[] stuff = this.SourceToDest.Split('-');
this.SourceSize = int.Parse(stuff[0], CultureInfo.InvariantCulture);
this.DestSize = int.Parse(stuff[1], CultureInfo.InvariantCulture);
this.sourceImage = new Image<TPixel>(this.Configuration, this.SourceSize, this.SourceSize);
this.sourceBitmap = new Bitmap(this.SourceSize, this.SourceSize);
}
@ -75,11 +75,13 @@ namespace SixLabors.ImageSharp.Benchmarks
// Parallel cases have been disabled for fast benchmark execution.
// Uncomment, if you are interested in parallel speedup
//[Benchmark(Description = "ImageSharp, MaxDegreeOfParallelism = 4")]
//public int ImageSharp_P4() => this.RunImageSharpResize(4);
/*
[Benchmark(Description = "ImageSharp, MaxDegreeOfParallelism = 4")]
public int ImageSharp_P4() => this.RunImageSharpResize(4);
//[Benchmark(Description = "ImageSharp, MaxDegreeOfParallelism = 8")]
//public int ImageSharp_P8() => this.RunImageSharpResize(8);
[Benchmark(Description = "ImageSharp, MaxDegreeOfParallelism = 8")]
public int ImageSharp_P8() => this.RunImageSharpResize(8);
*/
protected int RunImageSharpResize(int maxDegreeOfParallelism)
{
@ -110,9 +112,9 @@ namespace SixLabors.ImageSharp.Benchmarks
// [Host] : .NET Core 2.1.9 (CoreCLR 4.6.27414.06, CoreFX 4.6.27415.01), 64bit RyuJIT
// Clr : .NET Framework 4.7.2 (CLR 4.0.30319.42000), 64bit RyuJIT-v4.7.3394.0
// Core : .NET Core 2.1.9 (CoreCLR 4.6.27414.06, CoreFX 4.6.27415.01), 64bit RyuJIT
//
// IterationCount=3 LaunchCount=1 WarmupCount=3
//
//
// IterationCount=3 LaunchCount=1 WarmupCount=3
//
// Method | Job | Runtime | SourceToDest | Mean | Error | StdDev | Ratio | RatioSD | Gen 0/1k Op | Gen 1/1k Op | Gen 2/1k Op | Allocated Memory/Op |
// ----------------------------------------- |----- |-------- |------------- |----------:|----------:|----------:|------:|--------:|------------:|------------:|------------:|--------------------:|
// SystemDrawing | Clr | Clr | 3032-400 | 120.11 ms | 1.435 ms | 0.0786 ms | 1.00 | 0.00 | - | - | - | 1638 B |
@ -157,9 +159,9 @@ namespace SixLabors.ImageSharp.Benchmarks
// [Host] : .NET Core 2.1.9 (CoreCLR 4.6.27414.06, CoreFX 4.6.27415.01), 64bit RyuJIT
// Clr : .NET Framework 4.7.2 (CLR 4.0.30319.42000), 64bit RyuJIT-v4.7.3362.0
// Core : .NET Core 2.1.9 (CoreCLR 4.6.27414.06, CoreFX 4.6.27415.01), 64bit RyuJIT
//
//
// IterationCount=3 LaunchCount=1 WarmupCount=3
//
//
// Method | Job | Runtime | SourceSize | DestSize | Mean | Error | StdDev | Ratio | Gen 0/1k Op | Gen 1/1k Op | Gen 2/1k Op | Allocated Memory/Op |
// ----------------------------------------- |----- |-------- |----------- |--------- |----------:|----------:|----------:|------:|------------:|------------:|------------:|--------------------:|
// SystemDrawing | Clr | Clr | 3032 | 400 | 119.01 ms | 18.513 ms | 1.0147 ms | 1.00 | - | - | - | 1638 B |
@ -185,7 +187,7 @@ namespace SixLabors.ImageSharp.Benchmarks
// [Host] : .NET Core 2.1.9 (CoreCLR 4.6.27414.06, CoreFX 4.6.27415.01), 64bit RyuJIT
// Clr : .NET Framework 4.7.2 (CLR 4.0.30319.42000), 64bit RyuJIT-v4.7.3362.0
// Core : .NET Core 2.1.9 (CoreCLR 4.6.27414.06, CoreFX 4.6.27415.01), 64bit RyuJIT
//
//
// Method | Job | Runtime | SourceSize | DestSize | Mean | Error | StdDev | Ratio | RatioSD | Gen 0/1k Op | Gen 1/1k Op | Gen 2/1k Op | Allocated Memory/Op |
// ----------------------------------------- |----- |-------- |----------- |--------- |----------:|----------:|----------:|------:|--------:|------------:|------------:|------------:|--------------------:|
// SystemDrawing | Clr | Clr | 3032 | 400 | 121.37 ms | 48.580 ms | 2.6628 ms | 1.00 | 0.00 | - | - | - | 2048 B |
@ -195,7 +197,6 @@ namespace SixLabors.ImageSharp.Benchmarks
// 'ImageSharp, MaxDegreeOfParallelism = 1' | Core | Core | 3032 | 400 | 92.47 ms | 5.683 ms | 0.3115 ms | 0.78 | 0.01 | - | - | - | 44512 B |
}
public class Resize_BicubicCompand_Rgba32 : ResizeBenchmarkBase<Rgba32>
{
protected override void ExecuteResizeOperation(IImageProcessingContext ctx)
@ -212,9 +213,9 @@ namespace SixLabors.ImageSharp.Benchmarks
// [Host] : .NET Core 2.1.9 (CoreCLR 4.6.27414.06, CoreFX 4.6.27415.01), 64bit RyuJIT
// Clr : .NET Framework 4.7.2 (CLR 4.0.30319.42000), 64bit RyuJIT-v4.7.3362.0
// Core : .NET Core 2.1.9 (CoreCLR 4.6.27414.06, CoreFX 4.6.27415.01), 64bit RyuJIT
//
//
// IterationCount=3 LaunchCount=1 WarmupCount=3
//
//
// Method | Job | Runtime | SourceSize | DestSize | Mean | Error | StdDev | Ratio | RatioSD | Gen 0/1k Op | Gen 1/1k Op | Gen 2/1k Op | Allocated Memory/Op |
// ----------------------------------------- |----- |-------- |----------- |--------- |---------:|----------:|----------:|------:|--------:|------------:|------------:|------------:|--------------------:|
// SystemDrawing | Clr | Clr | 3032 | 400 | 120.7 ms | 68.985 ms | 3.7813 ms | 1.00 | 0.00 | - | - | - | 1638 B |
@ -223,4 +224,4 @@ namespace SixLabors.ImageSharp.Benchmarks
// SystemDrawing | Core | Core | 3032 | 400 | 118.3 ms | 6.899 ms | 0.3781 ms | 1.00 | 0.00 | - | - | - | 96 B |
// 'ImageSharp, MaxDegreeOfParallelism = 1' | Core | Core | 3032 | 400 | 122.4 ms | 15.069 ms | 0.8260 ms | 1.03 | 0.01 | - | - | - | 15712 B |
}
}
}

48
tests/ImageSharp.Benchmarks/Samplers/Rotate.cs

@ -1,4 +1,4 @@
// Copyright (c) Six Labors and contributors.
// Copyright (c) Six Labors and contributors.
// Licensed under the Apache License, Version 2.0.
using BenchmarkDotNet.Attributes;
@ -24,25 +24,27 @@ namespace SixLabors.ImageSharp.Benchmarks.Samplers
}
}
// Nov 7 2018
//BenchmarkDotNet=v0.10.14, OS=Windows 10.0.17763
//Intel Core i7-6600U CPU 2.60GHz(Skylake), 1 CPU, 4 logical and 2 physical cores
//.NET Core SDK = 2.1.403
// [Host] : .NET Core 2.1.5 (CoreCLR 4.6.26919.02, CoreFX 4.6.26919.02), 64bit RyuJIT
// Job-KKDIMW : .NET Framework 4.7.1 (CLR 4.0.30319.42000), 64bit RyuJIT-v4.7.3190.0
// Job-IUZRFA : .NET Core 2.1.5 (CoreCLR 4.6.26919.02, CoreFX 4.6.26919.02), 64bit RyuJIT
//LaunchCount=1 TargetCount=3 WarmupCount=3
// #### BEFORE ####:
// Method | Runtime | Mean | Error | StdDev | Allocated |
//--------- |-------- |---------:|----------:|----------:|----------:|
// DoRotate | Clr | 85.19 ms | 13.379 ms | 0.7560 ms | 6 KB |
// DoRotate | Core | 53.51 ms | 9.512 ms | 0.5375 ms | 4.29 KB |
// #### AFTER ####:
//Method | Runtime | Mean | Error | StdDev | Allocated |
//--------- |-------- |---------:|---------:|---------:|----------:|
// DoRotate | Clr | 77.08 ms | 23.97 ms | 1.354 ms | 6 KB |
// DoRotate | Core | 40.36 ms | 47.43 ms | 2.680 ms | 4.36 KB |
/*
Nov 7 2018
BenchmarkDotNet=v0.10.14, OS=Windows 10.0.17763
Intel Core i7-6600U CPU 2.60GHz(Skylake), 1 CPU, 4 logical and 2 physical cores
.NET Core SDK = 2.1.403
[Host] : .NET Core 2.1.5 (CoreCLR 4.6.26919.02, CoreFX 4.6.26919.02), 64bit RyuJIT
Job-KKDIMW : .NET Framework 4.7.1 (CLR 4.0.30319.42000), 64bit RyuJIT-v4.7.3190.0
Job-IUZRFA : .NET Core 2.1.5 (CoreCLR 4.6.26919.02, CoreFX 4.6.26919.02), 64bit RyuJIT
LaunchCount=1 TargetCount=3 WarmupCount=3
#### BEFORE ####:
Method | Runtime | Mean | Error | StdDev | Allocated |
--------- |-------- |---------:|----------:|----------:|----------:|
DoRotate | Clr | 85.19 ms | 13.379 ms | 0.7560 ms | 6 KB |
DoRotate | Core | 53.51 ms | 9.512 ms | 0.5375 ms | 4.29 KB |
#### AFTER ####:
Method | Runtime | Mean | Error | StdDev | Allocated |
--------- |-------- |---------:|---------:|---------:|----------:|
DoRotate | Clr | 77.08 ms | 23.97 ms | 1.354 ms | 6 KB |
DoRotate | Core | 40.36 ms | 47.43 ms | 2.680 ms | 4.36 KB |
*/

48
tests/ImageSharp.Benchmarks/Samplers/Skew.cs

@ -1,4 +1,4 @@
// Copyright (c) Six Labors and contributors.
// Copyright (c) Six Labors and contributors.
// Licensed under the Apache License, Version 2.0.
using BenchmarkDotNet.Attributes;
@ -24,25 +24,27 @@ namespace SixLabors.ImageSharp.Benchmarks.Samplers
}
}
// Nov 7 2018
//BenchmarkDotNet=v0.10.14, OS=Windows 10.0.17763
//Intel Core i7-6600U CPU 2.60GHz(Skylake), 1 CPU, 4 logical and 2 physical cores
//.NET Core SDK = 2.1.403
// [Host] : .NET Core 2.1.5 (CoreCLR 4.6.26919.02, CoreFX 4.6.26919.02), 64bit RyuJIT
// Job-KKDIMW : .NET Framework 4.7.1 (CLR 4.0.30319.42000), 64bit RyuJIT-v4.7.3190.0
// Job-IUZRFA : .NET Core 2.1.5 (CoreCLR 4.6.26919.02, CoreFX 4.6.26919.02), 64bit RyuJIT
//LaunchCount=1 TargetCount=3 WarmupCount=3
// #### BEFORE ####:
//Method | Runtime | Mean | Error | StdDev | Allocated |
//------- |-------- |---------:|---------:|----------:|----------:|
// DoSkew | Clr | 78.14 ms | 8.383 ms | 0.4736 ms | 6 KB |
// DoSkew | Core | 44.22 ms | 4.109 ms | 0.2322 ms | 4.28 KB |
// #### AFTER ####:
//Method | Runtime | Mean | Error | StdDev | Allocated |
//------- |-------- |---------:|----------:|----------:|----------:|
// DoSkew | Clr | 71.63 ms | 25.589 ms | 1.4458 ms | 6 KB |
// DoSkew | Core | 38.99 ms | 8.640 ms | 0.4882 ms | 4.36 KB |
/*
Nov 7 2018
BenchmarkDotNet=v0.10.14, OS=Windows 10.0.17763
Intel Core i7-6600U CPU 2.60GHz(Skylake), 1 CPU, 4 logical and 2 physical cores
.NET Core SDK = 2.1.403
[Host] : .NET Core 2.1.5 (CoreCLR 4.6.26919.02, CoreFX 4.6.26919.02), 64bit RyuJIT
Job-KKDIMW : .NET Framework 4.7.1 (CLR 4.0.30319.42000), 64bit RyuJIT-v4.7.3190.0
Job-IUZRFA : .NET Core 2.1.5 (CoreCLR 4.6.26919.02, CoreFX 4.6.26919.02), 64bit RyuJIT
LaunchCount=1 TargetCount=3 WarmupCount=3
#### BEFORE ####:
Method | Runtime | Mean | Error | StdDev | Allocated |
------- |-------- |---------:|---------:|----------:|----------:|
DoSkew | Clr | 78.14 ms | 8.383 ms | 0.4736 ms | 6 KB |
DoSkew | Core | 44.22 ms | 4.109 ms | 0.2322 ms | 4.28 KB |
#### AFTER ####:
Method | Runtime | Mean | Error | StdDev | Allocated |
------- |-------- |---------:|----------:|----------:|----------:|
DoSkew | Clr | 71.63 ms | 25.589 ms | 1.4458 ms | 6 KB |
DoSkew | Core | 38.99 ms | 8.640 ms | 0.4882 ms | 4.36 KB |
*/

4
tests/ImageSharp.Sandbox46/ImageSharp.Sandbox46.csproj

@ -18,6 +18,10 @@
<Compile Include="..\ImageSharp.Tests\**\*.cs" Link="Tests\%(RecursiveDir)%(Filename)%(Extension)" />
</ItemGroup>
<ItemGroup>
<Compile Remove="..\ImageSharp.Tests\IO\LocalFileSystem.cs" />
</ItemGroup>
<ItemGroup>
<PackageReference Include="Magick.NET-Q16-AnyCPU" />
<PackageReference Include="Moq" />

4
tests/ImageSharp.Sandbox46/Program.cs

@ -1,7 +1,5 @@
// <copyright file="Program.cs" company="James Jackson-South">
// Copyright (c) James Jackson-South and contributors.
// Copyright (c) Six Labors and contributors.
// Licensed under the Apache License, Version 2.0.
// </copyright>
using SixLabors.ImageSharp.Tests.PixelFormats.PixelOperations;
using SixLabors.ImageSharp.Tests.ProfilingBenchmarks;

15
tests/ImageSharp.Tests/Advanced/AdvancedImageExtensionsTests.cs

@ -1,4 +1,3 @@
// Copyright (c) Six Labors and contributors.
// Copyright (c) Six Labors and contributors.
// Licensed under the Apache License, Version 2.0.
@ -7,8 +6,8 @@ using System.Runtime.CompilerServices;
using SixLabors.ImageSharp.Advanced;
using SixLabors.ImageSharp.PixelFormats;
using Xunit;
// ReSharper disable InconsistentNaming
// ReSharper disable InconsistentNaming
namespace SixLabors.ImageSharp.Tests.Advanced
{
public class AdvancedImageExtensionsTests
@ -17,7 +16,7 @@ namespace SixLabors.ImageSharp.Tests.Advanced
{
[Theory]
[WithSolidFilledImages(1, 1, "Red", PixelTypes.Rgba32)]
[WithTestPatternImages(131, 127, PixelTypes.Rgba32 | PixelTypes.Bgr24)]
[WithTestPatternImage(131, 127, PixelTypes.Rgba32 | PixelTypes.Bgr24)]
public void WhenMemoryIsOwned<TPixel>(TestImageProvider<TPixel> provider)
where TPixel : struct, IPixel<TPixel>
{
@ -40,10 +39,9 @@ namespace SixLabors.ImageSharp.Tests.Advanced
}
}
[Theory]
[WithSolidFilledImages(1, 1, "Red", PixelTypes.Rgba32 | PixelTypes.Bgr24)]
[WithTestPatternImages(131, 127, PixelTypes.Rgba32 | PixelTypes.Bgr24)]
[WithTestPatternImage(131, 127, PixelTypes.Rgba32 | PixelTypes.Bgr24)]
public void WhenMemoryIsConsumed<TPixel>(TestImageProvider<TPixel> provider)
where TPixel : struct, IPixel<TPixel>
{
@ -73,7 +71,7 @@ namespace SixLabors.ImageSharp.Tests.Advanced
[Theory]
[WithSolidFilledImages(1, 1, "Red", PixelTypes.Rgba32)]
[WithTestPatternImages(131, 127, PixelTypes.Rgba32 | PixelTypes.Bgr24)]
[WithTestPatternImage(131, 127, PixelTypes.Rgba32 | PixelTypes.Bgr24)]
public void GetPixelRowMemory<TPixel>(TestImageProvider<TPixel> provider)
where TPixel : struct, IPixel<TPixel>
{
@ -99,7 +97,7 @@ namespace SixLabors.ImageSharp.Tests.Advanced
[Theory]
[WithSolidFilledImages(1, 1, "Red", PixelTypes.Rgba32)]
[WithTestPatternImages(131, 127, PixelTypes.Rgba32 | PixelTypes.Bgr24)]
[WithTestPatternImage(131, 127, PixelTypes.Rgba32 | PixelTypes.Bgr24)]
public void GetPixelRowSpan<TPixel>(TestImageProvider<TPixel> provider)
where TPixel : struct, IPixel<TPixel>
{
@ -126,7 +124,7 @@ namespace SixLabors.ImageSharp.Tests.Advanced
#pragma warning disable 0618
[Theory]
[WithTestPatternImages(131, 127, PixelTypes.Rgba32 | PixelTypes.Bgr24)]
[WithTestPatternImage(131, 127, PixelTypes.Rgba32 | PixelTypes.Bgr24)]
public unsafe void DangerousGetPinnableReference_CopyToBuffer<TPixel>(TestImageProvider<TPixel> provider)
where TPixel : struct, IPixel<TPixel>
{
@ -136,7 +134,6 @@ namespace SixLabors.ImageSharp.Tests.Advanced
ref byte source = ref Unsafe.As<TPixel, byte>(ref targetBuffer[0]);
ref byte dest = ref Unsafe.As<TPixel, byte>(ref image.DangerousGetPinnableReferenceToPixelBuffer());
fixed (byte* targetPtr = &source)
fixed (byte* pixelBasePtr = &dest)
{

4
tests/ImageSharp.Tests/Color/ColorTests.CastTo.cs

@ -1,5 +1,5 @@
// // Copyright (c) Six Labors and contributors.
// // Licensed under the Apache License, Version 2.0.
// Copyright (c) Six Labors and contributors.
// Licensed under the Apache License, Version 2.0.
using SixLabors.ImageSharp.PixelFormats;

12
tests/ImageSharp.Tests/Color/ColorTests.cs

@ -81,22 +81,22 @@ namespace SixLabors.ImageSharp.Tests
[Fact]
public void ShortHex()
{
Assert.Equal(new Rgb24(255, 255, 255), (Rgb24) Color.FromHex("#fff"));
Assert.Equal(new Rgb24(255, 255, 255), (Rgb24) Color.FromHex("fff"));
Assert.Equal(new Rgba32(0, 0, 0, 255), (Rgba32) Color.FromHex("000f"));
Assert.Equal(new Rgb24(255, 255, 255), (Rgb24)Color.FromHex("#fff"));
Assert.Equal(new Rgb24(255, 255, 255), (Rgb24)Color.FromHex("fff"));
Assert.Equal(new Rgba32(0, 0, 0, 255), (Rgba32)Color.FromHex("000f"));
}
[Fact]
public void LeadingPoundIsOptional()
{
Assert.Equal(new Rgb24(0, 128, 128), (Rgb24) Color.FromHex("#008080"));
Assert.Equal(new Rgb24(0, 128, 128), (Rgb24) Color.FromHex("008080"));
Assert.Equal(new Rgb24(0, 128, 128), (Rgb24)Color.FromHex("#008080"));
Assert.Equal(new Rgb24(0, 128, 128), (Rgb24)Color.FromHex("008080"));
}
[Fact]
public void ThrowsOnEmpty()
{
Assert.Throws<ArgumentException>(() => Color.FromHex(""));
Assert.Throws<ArgumentException>(() => Color.FromHex(string.Empty));
}
[Fact]

6
tests/ImageSharp.Tests/Color/ReferencePalette.cs

@ -1,5 +1,5 @@
// // Copyright (c) Six Labors and contributors.
// // Licensed under the Apache License, Version 2.0.
// Copyright (c) Six Labors and contributors.
// Licensed under the Apache License, Version 2.0.
using SixLabors.ImageSharp.PixelFormats;
@ -274,4 +274,4 @@ namespace SixLabors.ImageSharp.Tests
Rgba32.FromHex("#453b32")
};
}
}
}

10
tests/ImageSharp.Tests/Colorspaces/CieLabTests.cs

@ -1,4 +1,4 @@
// Copyright (c) Six Labors and contributors.
// Copyright (c) Six Labors and contributors.
// Licensed under the Apache License, Version 2.0.
using System.Numerics;
@ -32,15 +32,15 @@ namespace SixLabors.ImageSharp.Tests.Colorspaces
var y = new CieLab(Vector3.One);
Assert.True(default(CieLab) == default(CieLab));
Assert.True(default(CieLab) != new CieLab(1, 0, 1));
Assert.False(default(CieLab) == new CieLab(1, 0, 1));
Assert.True(new CieLab(1, 0, 1) != default(CieLab));
Assert.False(new CieLab(1, 0, 1) == default(CieLab));
Assert.Equal(default(CieLab), default(CieLab));
Assert.Equal(new CieLab(1, 0, 1), new CieLab(1, 0, 1));
Assert.Equal(new CieLab(Vector3.One), new CieLab(Vector3.One));
Assert.False(x.Equals(y));
Assert.False(default(CieLab) == new CieLab(1, 0, 1));
Assert.False(new CieLab(1, 0, 1) == default(CieLab));
Assert.False(x.Equals((object)y));
Assert.False(x.GetHashCode().Equals(y.GetHashCode()));
}
}
}
}

10
tests/ImageSharp.Tests/Colorspaces/CieXyChromaticityCoordinatesTests.cs

@ -1,4 +1,4 @@
// Copyright (c) Six Labors and contributors.
// Copyright (c) Six Labors and contributors.
// Licensed under the Apache License, Version 2.0.
using SixLabors.ImageSharp.ColorSpaces;
@ -29,15 +29,15 @@ namespace SixLabors.ImageSharp.Tests.Colorspaces
var y = new CieXyChromaticityCoordinates(1, 1);
Assert.True(default(CieXyChromaticityCoordinates) == default(CieXyChromaticityCoordinates));
Assert.True(default(CieXyChromaticityCoordinates) != new CieXyChromaticityCoordinates(1, 0));
Assert.False(default(CieXyChromaticityCoordinates) == new CieXyChromaticityCoordinates(1, 0));
Assert.True(new CieXyChromaticityCoordinates(1, 0) != default(CieXyChromaticityCoordinates));
Assert.False(new CieXyChromaticityCoordinates(1, 0) == default(CieXyChromaticityCoordinates));
Assert.Equal(default(CieXyChromaticityCoordinates), default(CieXyChromaticityCoordinates));
Assert.Equal(new CieXyChromaticityCoordinates(1, 0), new CieXyChromaticityCoordinates(1, 0));
Assert.Equal(new CieXyChromaticityCoordinates(1, 1), new CieXyChromaticityCoordinates(1, 1));
Assert.False(x.Equals(y));
Assert.False(default(CieXyChromaticityCoordinates) == new CieXyChromaticityCoordinates(1, 0));
Assert.False(new CieXyChromaticityCoordinates(1, 0) == default(CieXyChromaticityCoordinates));
Assert.False(x.Equals((object)y));
Assert.False(x.GetHashCode().Equals(y.GetHashCode()));
}
}
}
}

10
tests/ImageSharp.Tests/Colorspaces/Conversion/ApproximateColorspaceComparer.cs

@ -1,4 +1,4 @@
// Copyright (c) Six Labors and contributors.
// Copyright (c) Six Labors and contributors.
// Licensed under the Apache License, Version 2.0.
using System.Collections.Generic;
@ -30,13 +30,13 @@ namespace SixLabors.ImageSharp.Tests.Colorspaces.Conversion
IEqualityComparer<GammaWorkingSpace>,
IEqualityComparer<RgbWorkingSpace>
{
private readonly float Epsilon;
private readonly float epsilon;
/// <summary>
/// Initializes a new instance of the <see cref="ApproximateColorSpaceComparer"/> class.
/// </summary>
/// <param name="epsilon">The comparison error difference epsilon to use.</param>
public ApproximateColorSpaceComparer(float epsilon = 1F) => this.Epsilon = epsilon;
public ApproximateColorSpaceComparer(float epsilon = 1F) => this.epsilon = epsilon;
/// <inheritdoc/>
public bool Equals(Rgb x, Rgb y)
@ -234,7 +234,7 @@ namespace SixLabors.ImageSharp.Tests.Colorspaces.Conversion
private bool Equals(float x, float y)
{
float d = x - y;
return d >= -this.Epsilon && d <= this.Epsilon;
return d >= -this.epsilon && d <= this.epsilon;
}
}
}
}

5
tests/ImageSharp.Tests/Colorspaces/Conversion/CieLchAndCieXyyConversionTests.cs

@ -1,4 +1,4 @@
// Copyright (c) Six Labors and contributors.
// Copyright (c) Six Labors and contributors.
// Licensed under the Apache License, Version 2.0.
using System;
@ -69,11 +69,10 @@ namespace SixLabors.ImageSharp.Tests.Colorspaces.Conversion
// Assert
Assert.Equal(expected, actual, ColorSpaceComparer);
for (int i = 0; i < actualSpan.Length; i++)
{
Assert.Equal(expected, actualSpan[i], ColorSpaceComparer);
}
}
}
}
}

5
tests/ImageSharp.Tests/Colorspaces/Conversion/CieLchuvAndCieLuvConversionTests.cs

@ -1,4 +1,4 @@
// Copyright (c) Six Labors and contributors.
// Copyright (c) Six Labors and contributors.
// Licensed under the Apache License, Version 2.0.
using System;
@ -87,11 +87,10 @@ namespace SixLabors.ImageSharp.Tests.Colorspaces.Conversion
// Assert
Assert.Equal(expected, actual, ColorSpaceComparer);
for (int i = 0; i < actualSpan.Length; i++)
{
Assert.Equal(expected, actualSpan[i], ColorSpaceComparer);
}
}
}
}
}

5
tests/ImageSharp.Tests/Colorspaces/Conversion/CieLuvAndCieXyyConversionTests.cs

@ -1,4 +1,4 @@
// Copyright (c) Six Labors and contributors.
// Copyright (c) Six Labors and contributors.
// Licensed under the Apache License, Version 2.0.
using System;
@ -70,11 +70,10 @@ namespace SixLabors.ImageSharp.Tests.Colorspaces.Conversion
// Assert
Assert.Equal(expected, actual, ColorSpaceComparer);
for (int i = 0; i < actualSpan.Length; i++)
{
Assert.Equal(expected, actualSpan[i], ColorSpaceComparer);
}
}
}
}
}

5
tests/ImageSharp.Tests/Colorspaces/Conversion/CieLuvAndHslConversionTests.cs

@ -1,4 +1,4 @@
// Copyright (c) Six Labors and contributors.
// Copyright (c) Six Labors and contributors.
// Licensed under the Apache License, Version 2.0.
using System;
@ -70,11 +70,10 @@ namespace SixLabors.ImageSharp.Tests.Colorspaces.Conversion
// Assert
Assert.Equal(expected, actual, ColorSpaceComparer);
for (int i = 0; i < actualSpan.Length; i++)
{
Assert.Equal(expected, actualSpan[i], ColorSpaceComparer);
}
}
}
}
}

5
tests/ImageSharp.Tests/Colorspaces/Conversion/CieLuvAndHsvConversionTests.cs

@ -1,4 +1,4 @@
// Copyright (c) Six Labors and contributors.
// Copyright (c) Six Labors and contributors.
// Licensed under the Apache License, Version 2.0.
using System;
@ -70,11 +70,10 @@ namespace SixLabors.ImageSharp.Tests.Colorspaces.Conversion
// Assert
Assert.Equal(expected, actual, ColorSpaceComparer);
for (int i = 0; i < actualSpan.Length; i++)
{
Assert.Equal(expected, actualSpan[i], ColorSpaceComparer);
}
}
}
}
}

5
tests/ImageSharp.Tests/Colorspaces/Conversion/CieLuvAndHunterLabConversionTests.cs

@ -1,4 +1,4 @@
// Copyright (c) Six Labors and contributors.
// Copyright (c) Six Labors and contributors.
// Licensed under the Apache License, Version 2.0.
using System;
@ -70,11 +70,10 @@ namespace SixLabors.ImageSharp.Tests.Colorspaces.Conversion
// Assert
Assert.Equal(expected, actual, ColorSpaceComparer);
for (int i = 0; i < actualSpan.Length; i++)
{
Assert.Equal(expected, actualSpan[i], ColorSpaceComparer);
}
}
}
}
}

5
tests/ImageSharp.Tests/Colorspaces/Conversion/CieLuvAndLinearRgbConversionTests.cs

@ -1,4 +1,4 @@
// Copyright (c) Six Labors and contributors.
// Copyright (c) Six Labors and contributors.
// Licensed under the Apache License, Version 2.0.
using System;
@ -70,11 +70,10 @@ namespace SixLabors.ImageSharp.Tests.Colorspaces.Conversion
// Assert
Assert.Equal(expected, actual, ColorSpaceComparer);
for (int i = 0; i < actualSpan.Length; i++)
{
Assert.Equal(expected, actualSpan[i], ColorSpaceComparer);
}
}
}
}
}

5
tests/ImageSharp.Tests/Colorspaces/Conversion/CieLuvAndLmsConversionTests.cs

@ -1,4 +1,4 @@
// Copyright (c) Six Labors and contributors.
// Copyright (c) Six Labors and contributors.
// Licensed under the Apache License, Version 2.0.
using System;
@ -70,11 +70,10 @@ namespace SixLabors.ImageSharp.Tests.Colorspaces.Conversion
// Assert
Assert.Equal(expected, actual, ColorSpaceComparer);
for (int i = 0; i < actualSpan.Length; i++)
{
Assert.Equal(expected, actualSpan[i], ColorSpaceComparer);
}
}
}
}
}

Some files were not shown because too many files changed in this diff

Loading…
Cancel
Save