Skip to content

Instantly share code, notes, and snippets.

@gaufung
Created January 13, 2021 06:09
Show Gist options
  • Save gaufung/a6ba767c05b6fddf098d51e82920e377 to your computer and use it in GitHub Desktop.
Save gaufung/a6ba767c05b6fddf098d51e82920e377 to your computer and use it in GitHub Desktop.
ModuloVsFastRange benchmark.cs
using BenchmarkDotNet.Attributes;
using BenchmarkDotNet.Jobs;
using BenchmarkDotNet.Running;
using System;
namespace FastRangeBenchmark
{
class Program
{
static void Main(string[] args)
{
var summary = BenchmarkRunner.Run<ModuloVsFastRange>();
Console.WriteLine(summary.ToString());
}
}
[SimpleJob(RuntimeMoniker.CoreRt50)]
public class ModuloVsFastRange
{
[Params(10)]
public int N;
public long[] aa;
public long b;
long LongRandom(long min, long max, Random rand)
{
byte[] buf = new byte[8];
rand.NextBytes(buf);
long longRand = BitConverter.ToInt64(buf, 0);
return (Math.Abs(longRand % (max - min)) + min);
}
[IterationSetup]
public void Setup()
{
Random rand = new Random();
aa = new long[1000];
for(int i = 0; i < 1000; i++)
{
aa[i] = LongRandom(0, long.MaxValue, rand);
}
b = LongRandom(0, long.MaxValue, rand);
}
[Benchmark]
public long Modulo()
{
long val = 0L;
for (int i = 0; i < 1000; i++)
{
val = aa[i] % b;
}
return val;
}
[Benchmark]
public long FastRange()
{
long val = 0L;
for (int i = 0; i < 1000; i++)
{
ulong u = (ulong)aa[i];
ulong v = (ulong)b;
var u0 = (ulong)(uint)u;
var u1 = u >> 32;
var v0 = (ulong)(uint)v;
var v1 = v >> 32;
var carry = u0 * v0;
carry = (carry >> 32) + (u0 * v1);
var r2 = carry >> 32;
carry = (uint)carry + (u1 * v0);
val = (long)((carry >> 32) + r2 + (u1 * v1));
}
return val;
}
// using two ulong value to store the UInt128
private (ulong, ulong) Multiply(ulong u, ulong v)
{
var u0 = (ulong)(uint)u;
var u1 = u >> 32;
var v0 = (ulong)(uint)v;
var v1 = v >> 32;
var carry = u0 * v0;
var r0 = (uint)carry;
carry = (carry >> 32) + (u0 * v1);
var r2 = carry >> 32;
carry = (uint)carry + (u1 * v0);
return (carry << 32 | r0, (carry >> 32) + r2 + (u1 * v1));
}
}
}
@gaufung
Copy link
Author

gaufung commented Jan 13, 2021

Method N Mean Error StdDev Median
Modulo 10 7.392 us 0.0767 us 0.0641 us 7.400 us
FastRange 10 2.368 us 0.2496 us 0.7359 us 1.900 us

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment