📷 A modern, cross-platform, 2D Graphics library for .NET
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

// 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 |
}
}