Created
January 13, 2021 06:09
-
-
Save gaufung/a6ba767c05b6fddf098d51e82920e377 to your computer and use it in GitHub Desktop.
ModuloVsFastRange benchmark.cs
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
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)); | |
} | |
} | |
} |
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