Skip to content

Instantly share code, notes, and snippets.

@alanta
Created May 24, 2017 20:44
Show Gist options
  • Star 0 You must be signed in to star a gist
  • Fork 0 You must be signed in to fork a gist
  • Save alanta/fe6d10abcad5217deff9a25b32ddb172 to your computer and use it in GitHub Desktop.
Save alanta/fe6d10abcad5217deff9a25b32ddb172 to your computer and use it in GitHub Desktop.
Version 2 of benchmark tests for fast rounding code
using System;
using System.Linq;
using BenchmarkDotNet.Attributes;
using BenchmarkDotNet.Running;
using System.Runtime.InteropServices;
namespace ClassLibrary2
{
public class Rounding
{
private const int N = 100000;
private readonly float[] data;
private readonly float[] data2;
private readonly int[] output = new int[N];
public Rounding()
{
data = new float[N];
var random = new Random(42);
for (var x = 0; x < N; x++)
{
data[x] = random.Next(-25, 25) / 10f;
}
data2 = new float[N];
data.CopyTo(data2, 0);
}
[Benchmark]
public int[] Round()
{
for (var i = 0; i < N; i++)
{
output[i] = (int)Math.Round(data[i], 0, MidpointRounding.AwayFromZero);
}
return output;
}
[Benchmark]
public int[] AddAndCast()
{
for (var i = 0; i < N; i++)
{
output[i] = (int)(data[i] - 0.5f);
}
return output;
}
[Benchmark]
public int[] AddAndCast2()
{
for (var i = 0; i < N; i++)
{
output[i] = data[i] > 0 ? (int)(data[i] + 0.5f) : (int)(data[i] - 0.5f);
}
return output;
}
[Benchmark]
public int[] RoundFast()
{
for (var i = 0; i < N; i++)
{
var num = data[i];
output[i] = (int)(num + 0.5f * (-1 + 2 * (1 + num - (num + 1) % num) / num));
}
return output;
}
[Benchmark]
public int[] ConvertToInt()
{
for (var i = 0; i < N; i++)
{
output[i] = Convert.ToInt32(data[i]);
}
return output;
}
[Benchmark]
public void Native() {
roundAll(data2.Length, data2);
}
[DllImport("nativeFunctions.dll")] // or however you call your dll
static extern void roundAll(int len, float[] data);
}
public class Class1
{
public static void Main(string[] args)
{
var summary = BenchmarkRunner.Run<Rounding>();
}
}
}
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment