From 3d1368cabf47b6d8e4bac59fd0259478b5df3181 Mon Sep 17 00:00:00 2001 From: Rokas Puzonas Date: Tue, 28 Feb 2023 02:03:37 +0200 Subject: [PATCH] update benchmarking --- Lab1/Program.cs | 104 +++++++++++++++++++++++------------------ Lab1/Test Results.xlsx | Bin 0 -> 18388 bytes 2 files changed, 58 insertions(+), 46 deletions(-) create mode 100644 Lab1/Test Results.xlsx diff --git a/Lab1/Program.cs b/Lab1/Program.cs index ea2830b..b21dda7 100644 --- a/Lab1/Program.cs +++ b/Lab1/Program.cs @@ -7,61 +7,58 @@ namespace Lab1 class Program { // O(n^5) - public static double T1(int[] n, int size) + public static int T1(int[] n, int size) { - if (size >= 1) + if (size < 1) + return 0; + + int sum = 0; + for (int i = 0; i < Math.Pow(size, 5); i++) { - int sum = 0; - for (int i = 0; i < Math.Pow(size, 5); i++) - { - sum += i; - } - return 2 * T1(n, size / 9) + sum; + sum++; } - return 0; + return T1(n, size / 9) + T1(n, size / 9) + sum; } - public static double T1(int[] n) + public static int T1(int[] n) { return T1(n, n.Length); } // O(n) - public static double T2(int[] n, int size) + public static int T2(int[] n, int size) { - if (size >= 1) + if (size < 1) + return 0; + + int sum = 0; + for (int i = 0; i < size; i++) { - int sum = 0; - for (int i = 0; i < size; i++) - { - sum += i; - } - return T2(n, size / 6) + T2(n, size / 7) + sum; + sum++; } - return 0; + return T2(n, size / 6) + T2(n, size / 7) + sum; } - public static double T2(int[] n) + public static int T2(int[] n) { return T2(n, n.Length); } // O(n^2) - public static double T3(int[] n, int size) + public static int T3(int[] n, int size) { - if (size >= 1) + if (size < 1) + return 0; + + int sum = 0; + for (int i = 0; i < size; i++) { - int sum = 0; - for (int i = 0; i < size; i++) - { - sum += i; - } - return T3(n, size - 8) + T3(n, size - 6) + sum; + sum++; } - return 0; + return T3(n, size - 8) + T3(n, size - 6) + sum; } - public static double T3(int[] n) + public static int T3(int[] n) { return T3(n, n.Length); } @@ -94,13 +91,17 @@ namespace Lab1 public static void Triangles() { - BMPImage image = new BMPImage(1000, 1000); + uint size = 40_000; + BMPImage image = new BMPImage(size, size); image.Fill(new Color(255, 255, 255)); + var before = DateTime.Now; TrianglesRecursive(image, 0, 0, image.width, image.height); + var duration = DateTime.Now - before; + Console.WriteLine("Triangles render duration: {0}", duration.TotalSeconds); image.Write("result.bmp"); } - public static double TestFunc(Func T, uint n) + public static double TestFunc(Func T, uint n) { int[] data = new int[n]; for (int i = 0; i < n; i++) @@ -116,23 +117,34 @@ namespace Lab1 static void Main() { - // T1(10) => 0.0056552 - // T1(20) => 0.0699722 - // T1(40) => 2.1500858 - // T1(50) => 6.4564238 + /* + uint[] N1 = { 10, 15, 20, 25, 30, 35, 40 }; + Console.WriteLine("T1, s"); + foreach (uint n in N1) + { + Console.WriteLine("{0}, {1}", n, TestFunc(T1, n)); + } + */ - // T2(100) => 0.0039419 - // T2(1_000_000) => 0.0048064 - // T2(250_000_000) => 0.3011757 - // T2(500_000_000) => 0.6046134 - // T2(1_000_000_000) => 1.1902643 + /* + uint[] N2 = { 100, 1_000_000, 250_000_000, 500_000_000, 1_000_000_000, 1_500_000_000 }; + Console.WriteLine("T2, s"); + foreach (uint n in N2) + { + Console.WriteLine("{0}, {1}", n, TestFunc(T2, n)); + } + */ - // T3(100) => 0.0041945 - // T3(150) => 0.0759872 - // T3(180) => 1.4428123 - // T3(190) => 3.9067703 + /* + uint[] N3 = { 100, 150, 160, 170, 180, 185 }; + Console.WriteLine("T3, s"); + foreach (uint n in N3) + { + Console.WriteLine("{0}, {1}", n, TestFunc(T3, n)); + } + */ - //Triangles(); + Triangles(); } } } diff --git a/Lab1/Test Results.xlsx b/Lab1/Test Results.xlsx new file mode 100644 index 0000000000000000000000000000000000000000..c91a731a310ad48aee09ce4883aa914e1d0bec14 GIT binary patch literal 18388 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 literal 0 HcmV?d00001