mirror of https://github.com/SixLabors/ImageSharp
You can not select more than 25 topics
Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
60 lines
1.9 KiB
60 lines
1.9 KiB
// Copyright (c) Six Labors.
|
|
// Licensed under the Apache License, Version 2.0.
|
|
|
|
using System.Numerics;
|
|
using System.Runtime.CompilerServices;
|
|
using BenchmarkDotNet.Attributes;
|
|
|
|
namespace SixLabors.ImageSharp.Benchmarks.General.BasicMath
|
|
{
|
|
public class ClampVector4
|
|
{
|
|
private readonly float min = -1.5f;
|
|
private readonly float max = 2.5f;
|
|
private static readonly float[] Values = { -10, -5, -3, -1.5f, -0.5f, 0f, 1f, 1.5f, 2.5f, 3, 10 };
|
|
|
|
[Benchmark(Baseline = true)]
|
|
public Vector4 UsingVectorClamp()
|
|
{
|
|
Vector4 acc = Vector4.Zero;
|
|
|
|
for (int i = 0; i < Values.Length; i++)
|
|
{
|
|
acc += ClampUsingVectorClamp(Values[i], this.min, this.max);
|
|
}
|
|
|
|
return acc;
|
|
}
|
|
|
|
[Benchmark]
|
|
public Vector4 UsingVectorMinMax()
|
|
{
|
|
Vector4 acc = Vector4.Zero;
|
|
|
|
for (int i = 0; i < Values.Length; i++)
|
|
{
|
|
acc += ClampUsingVectorMinMax(Values[i], this.min, this.max);
|
|
}
|
|
|
|
return acc;
|
|
}
|
|
|
|
[MethodImpl(MethodImplOptions.AggressiveInlining)]
|
|
private static Vector4 ClampUsingVectorClamp(float x, float min, float max)
|
|
{
|
|
return Vector4.Clamp(new Vector4(x), new Vector4(min), new Vector4(max));
|
|
}
|
|
|
|
[MethodImpl(MethodImplOptions.AggressiveInlining)]
|
|
private static Vector4 ClampUsingVectorMinMax(float x, float min, float max)
|
|
{
|
|
return Vector4.Min(new Vector4(max), Vector4.Max(new Vector4(min), new Vector4(x)));
|
|
}
|
|
|
|
// RESULTS
|
|
// | Method | Mean | Error | StdDev | Ratio |
|
|
// |------------------ |---------:|---------:|---------:|------:|
|
|
// | UsingVectorClamp | 75.21 ns | 1.572 ns | 4.057 ns | 1.00 |
|
|
// | UsingVectorMinMax | 15.35 ns | 0.356 ns | 0.789 ns | 0.20 |
|
|
}
|
|
}
|
|
|