From f5e73368a104211d6216c95047d48d8c2ffc337f Mon Sep 17 00:00:00 2001 From: James Jackson-South Date: Thu, 14 Jul 2016 14:18:22 +1000 Subject: [PATCH] Faster clamp 30% performance increase removing ternary operator. Former-commit-id: 9664ddb7da1c63be4034d0466ac10560db42edf0 Former-commit-id: 019ec4638e02acdf8bafc1f251859a25f75f07d2 Former-commit-id: 9b608a6ba964226e0f45d023d466f207aa24c796 --- src/ImageProcessorCore/PackedVector/Bgra32.cs | 24 +++++++++++++++---- .../Color/Clamp.cs | 17 +++++++++++++ .../Samplers/Resize.cs | 2 +- 3 files changed, 38 insertions(+), 5 deletions(-) diff --git a/src/ImageProcessorCore/PackedVector/Bgra32.cs b/src/ImageProcessorCore/PackedVector/Bgra32.cs index eed4d5c02f..3372cb2833 100644 --- a/src/ImageProcessorCore/PackedVector/Bgra32.cs +++ b/src/ImageProcessorCore/PackedVector/Bgra32.cs @@ -270,8 +270,16 @@ namespace ImageProcessorCore [MethodImpl(MethodImplOptions.AggressiveInlining)] private static byte Clamp(float value) { - value = (value > 255) ? 255 : value; - value = (value < 0) ? 0 : value; + if (value > 255) + { + return 255; + } + + if (value < 0) + { + return 0; + } + return (byte)value; } @@ -285,8 +293,16 @@ namespace ImageProcessorCore [MethodImpl(MethodImplOptions.AggressiveInlining)] private static byte Clamp(double value) { - value = (value > 255) ? 255 : value; - value = (value < 0) ? 0 : value; + if (value > 255) + { + return 255; + } + + if (value < 0) + { + return 0; + } + return (byte)value; } diff --git a/tests/ImageProcessorCore.Benchmarks/Color/Clamp.cs b/tests/ImageProcessorCore.Benchmarks/Color/Clamp.cs index 93b6cd94e6..7af7010ab8 100644 --- a/tests/ImageProcessorCore.Benchmarks/Color/Clamp.cs +++ b/tests/ImageProcessorCore.Benchmarks/Color/Clamp.cs @@ -22,5 +22,22 @@ namespace ImageProcessorCore.Benchmarks.Color return (byte)value; } + [Benchmark(Description = "No Maths Clamp No Ternary")] + public byte ClampNoMathsNoTernary() + { + double value = 256; + + if(value > 255) + { + return 255; + } + + if (value < 0) + { + return 0; + } + + return (byte)value; + } } } diff --git a/tests/ImageProcessorCore.Benchmarks/Samplers/Resize.cs b/tests/ImageProcessorCore.Benchmarks/Samplers/Resize.cs index 65ed841f00..e5eb412f29 100644 --- a/tests/ImageProcessorCore.Benchmarks/Samplers/Resize.cs +++ b/tests/ImageProcessorCore.Benchmarks/Samplers/Resize.cs @@ -21,7 +21,7 @@ graphics.InterpolationMode = InterpolationMode.HighQualityBicubic; graphics.PixelOffsetMode = PixelOffsetMode.HighQuality; graphics.CompositingQuality = CompositingQuality.HighQuality; - graphics.DrawImage(source, 0, 0, 100, 100); + graphics.DrawImage(source, 0, 0, 400, 400); } return destination.Size;