csharp/EPAM.Deltix.DFP.Benchmark/Benchmark.cs (89 lines of code) (raw):

using System; using BenchmarkDotNet.Attributes; using BenchmarkDotNet.Running; namespace EPAM.Deltix.DFP.Benchmark { public static class Decimal64Managed { public static Decimal64 Add(Decimal64 a, Decimal64 b) { return Decimal64.FromUnderlying(Bid64Add.bid64_add(a.Bits, b.Bits)); } public static Decimal64 Mul(Decimal64 a, Decimal64 b) { return Decimal64.FromUnderlying(Bid64Mul.bid64_mul(a.Bits, b.Bits)); } public static Decimal64 Div(Decimal64 a, Decimal64 b) { return Decimal64.FromUnderlying(Bid64Div.bid64_div(a.Bits, b.Bits)); } } public class Benchmark { [Params(509104287)] public int randomSeed { get; set; } [Params(1000_000)] public int N { get; set; } public Decimal64[] values; [GlobalSetup] public void Setup() { values = new Decimal64[N + 1]; var generator = new RandomDecimalsGenerator(randomSeed); for (int i = 0; i < values.Length; ++i) values[i] = generator.NextX(); } [Benchmark] public void AddNative() { for (int i = 0; i < N; ++i) { var c = values[i] + values[i + 1]; } } [Benchmark] public void MultiplyNative() { for (int i = 0; i < N; ++i) { var c = values[i] * values[i + 1]; } } [Benchmark] public void DivisionNative() { for (int i = 0; i < N; ++i) { var c = values[i] / values[i + 1]; } } [Benchmark] public void AddManaged() { for (int i = 0; i < N; ++i) { var c = Decimal64Managed.Add(values[i], values[i + 1]); } } [Benchmark] public void MultiplyManaged() { for (int i = 0; i < N; ++i) { var c = Decimal64Managed.Mul(values[i], values[i + 1]); } } [Benchmark] public void DivisionManaged() { for (int i = 0; i < N; ++i) { var c = Decimal64Managed.Div(values[i], values[i + 1]); } } public static void Main(String[] args) { var summary = BenchmarkRunner.Run<Benchmark>(); } } }