Blizzardo1 icon

Loop Test

Blizzardo1 | PRO | 08/10/21 06:01:43 PM UTC | 0 ⭐ | 1716 👁️ | Never ⏰ | []
C# |

6.29 KB

|

None

|

0 👍

/

0 👎

using System;
using System.Diagnostics;
using System.IO;
using System.Linq;
using System.Security.Cryptography;
using System.Text;
 
namespace LoopScopeTest
{
    internal static class Program
    {
        private static readonly Encoding encoding = Encoding.UTF8;
        public static string GetString(this byte[] b) => encoding.GetString(b);
        public static byte[] ToBytes(this string s) => encoding.GetBytes(s);
        public static byte[] GetFromHex(this string s) => Convert.FromHexString(s);
 
        public static long Average(this long[] l) => l.Aggregate((x, y) => x + y) / l.Length;
 
        private record Data(string[] DataLine)
        {
            static byte[] key = { }; // Add your key here!
            private SHA256 hmac = SHA256.Create();
            private byte[] data;
 
            public long Overall;
            public long InlineTest;
            public long OutOfScopeTest;
            public long Difference;
            public string Hash;
            public Data GetData()
            {
                _ = long.TryParse(DataLine[0], out Overall);
                _ = long.TryParse(DataLine[1], out InlineTest);
                _ = long.TryParse(DataLine[2], out OutOfScopeTest);
                _ = long.TryParse(DataLine[3], out Difference);
                Hash = DataLine[4];
                data = ToString().ToBytes();
                return this;
            }
 
            public bool IsDataValid()
            {
                byte[] left = Hash.GetFromHex();
                byte[] right = hmac.ComputeHash(data);
                string a = Convert.ToHexString(left);
                string b = Convert.ToHexString(right);
 
                return a == b;
            }
 
            public string CompileHash() => BitConverter.ToString(hmac.ComputeHash(data)).Replace("-", "").ToLower();
 
            public override string ToString()
            {
                return $"{Overall};{InlineTest};{OutOfScopeTest};{Difference}";
            }
        }
 
        private static long InlineForloop(ulong iterations)
        {
            Stopwatch sw = new();
            var sb = new StringBuilder();
            sb.AppendLine($"Testing inline forloop initializer with {iterations} iterations");
            sb.AppendLine("for (ulong u = 0; u < iterations; u++) ; ");
            Console.WriteLine(sb.ToString());
            if (sw == null) sw = new();
            sw.Start();
            for (ulong u = 0; u < iterations; u++) ;
            sw.Stop();
            return sw.ElapsedMilliseconds;
        }
 
        private static long OutOfScopeForloop(ulong iterations)
        {
            Stopwatch sw = new();
            var sb = new StringBuilder();
            sb.AppendLine($"Testing out of scope forloop initializer with {iterations} iterations");
            sb.AppendLine("ulong u;");
            sb.AppendLine("for (u = 0; u < iterations; u++) ; ");
            Console.WriteLine(sb.ToString());
 
            if (sw == null) sw = new();
            sw.Start();
            ulong u;
            for (u = 0; u < iterations; u++) ;
            sw.Stop();
            return sw.ElapsedMilliseconds;
        }
 
        private static long RunTest(string testName, ulong iterations, Func<ulong, long> test)
        {
            long result = test(iterations);
            Console.WriteLine($"{testName}: {result}ms");
            Console.WriteLine("\n\n");
            return result;
        }
 
        private static void Main(string[] args)
        {
            Stopwatch sw = new();
            sw.Start();
 
            const string log = "tests.log";
            if(!File.Exists(log))
            {
                File.WriteAllText(log, "Overall,Inline,Out of Scope,Difference,Hash\n");
            }
 
            string[] history = File.ReadAllLines(log);
            long[] overallAverage= new long[history.Length];
            long[] testAAverage = new long[history.Length];
            long[] testBAverage = new long[history.Length];
            long[] differenceAverage = new long[history.Length];
            Console.WriteLine("Retrieving history\n");
 
 
            if (history.Length > 1)
            {
                for (int i = 1; i < history.Length; i++)
                {
                    Data data = new Data(history[i].Split(',')).GetData();
                    
                    if (!data.IsDataValid())
                    {
                        Console.WriteLine($"Invalid Data, Line {i + 1}");
                        continue;
                    }
                    overallAverage[i] = data.Overall;
                    testAAverage[i] = data.InlineTest;
                    testBAverage[i] = data.OutOfScopeTest;
                    differenceAverage[i] = data.Difference;
                }
            }
            if (history.Length > 1)
            {
                Console.WriteLine($"Overall average {overallAverage.Average()}ms");
                Console.WriteLine($"Inline Test average {testAAverage.Average()}ms");
                Console.WriteLine($"Out of Initialization average {testBAverage.Average()}ms");
                Console.WriteLine($"Difference average {differenceAverage.Average()}ms");
                Console.WriteLine();
            }
 
            var sb = new StringBuilder();
            ulong iterations = int.MaxValue;
            long testA = RunTest("Inline Test", iterations, InlineForloop);
            long testB = RunTest("Out of Scope Test", iterations, OutOfScopeForloop);
            long overall = testA + testB;
            long difference = Math.Abs(testA - testB);
            Console.WriteLine($"Difference of {difference}ms");
            Console.WriteLine($"Total test time {overall}ms");
            Console.WriteLine("\nTest complete!\n\n");
            sw.Stop();
            Console.WriteLine($"Program Runtime: {sw.ElapsedMilliseconds}ms\n\n");
            Console.WriteLine($"That's an additional {sw.ElapsedMilliseconds - overall}ms of runtime.");
            sb.AppendLine($"{overall},{testA},{testB},{difference},{new Data(new string[] { overall.ToString(), testA.ToString(), testB.ToString(), difference.ToString(), "" }).GetData().CompileHash()}");
            File.AppendAllText(log, sb.ToString());
 
        }
    }
}
 

Comments

  •  icon
    01/01/70 12:00:00 AM UTC
    Plain Text |

    0 B

    |

    👍

    /

    👎