using System;
using BenchmarkDotNet.Attributes;
using Umbraco.Core;
using Umbraco.Tests.Benchmarks.Config;

namespace Umbraco.Tests.Benchmarks
{
    [QuickRunWithMemoryDiagnoserConfig]
    public class CombineGuidBenchmarks
    {
        private static readonly Guid _a = Guid.NewGuid();
        private static readonly Guid _b = Guid.NewGuid();

        [Benchmark]
        public byte[] CombineUtils() => GuidUtils.Combine(_a, _b).ToByteArray();

        [Benchmark]
        public byte[] CombineLoop() => Combine(_a, _b);

        private static byte[] Combine(Guid guid1, Guid guid2)
        {
            var bytes1 = guid1.ToByteArray();
            var bytes2 = guid2.ToByteArray();
            var bytes = new byte[bytes1.Length];
            for (var i = 0; i < bytes1.Length; i++)
            {
                bytes[i] = (byte)(bytes1[i] ^ bytes2[i]);
            }

            return bytes;
        }
    }

    // Nov 8 2018
    //BenchmarkDotNet=v0.11.2, OS=Windows 10.0.17763.55 (1809/October2018Update/Redstone5)
    //Intel Core i7-6600U CPU 2.60GHz(Skylake), 1 CPU, 4 logical and 2 physical cores
    //  [Host]     : .NET Framework 4.7.2 (CLR 4.0.30319.42000), 32bit LegacyJIT-v4.7.3190.0
    //  Job-JIATTD : .NET Framework 4.7.2 (CLR 4.0.30319.42000), 32bit LegacyJIT-v4.7.3190.0

    //IterationCount=3  IterationTime=100.0000 ms LaunchCount = 1
    //WarmupCount=3

    //       Method |     Mean |     Error |    StdDev | Gen 0/1k Op | Gen 1/1k Op | Gen 2/1k Op | Allocated Memory/Op |
    //------------- |---------:|----------:|----------:|------------:|------------:|------------:|--------------------:|
    // CombineUtils | 33.34 ns |  8.086 ns | 0.4432 ns |      0.0133 |           - |           - |                28 B |
    //  CombineLoop | 55.03 ns | 11.311 ns | 0.6200 ns |      0.0395 |           - |           - |                84 B |
}

