Gå til indholdet

N320 Benchmark.NET

I denne opgave skal du bruge BenchmarkDotNet til at sammenligne ydeevnen mellem to forskellige metoder til at finde primtal. Målet er at finde ud af, hvilken metode der er hurtigere ved hjælp af BenchmarkDotNet.

  • Skab en tom konsol applikation
  • Installer BenchmarkDotNet-biblioteket i dit projekt ved hjælp af NuGet
  • Opret en ny klasse kaldet PrimeNumberBenchmark og tilføj to metoder, IsPrimeSimple og IsPrimeOptimized, der begge tager et heltal som input og returnerer en boolsk værdi, der angiver, om tallet er et primtal eller ej.
  • Implementer IsPrimeSimple metoden ved hjælp af en simpel tilgang, hvor alle tal fra 2 til n-1 kontrolleres for at se, om de er divisorer af n. Hvis der ikke findes nogen divisorer, er tallet et primtal. Eksempelvis:
private bool IsPrimeSimple(int n)
{
    if (n <= 1) return false;

    for (int i = 2; i < n; i++)
    {
        if (n % i == 0) return false;
    }

    return true;
}
  • Implementer IsPrimeOptimized metoden ved hjælp af en optimeret tilgang, hvor kun tal op til kvadratroden af n kontrolleres for at se, om de er divisorer af n - eksempelvis:
private bool IsPrimeOptimized(int n)
{
    if (n <= 1) return false;
    if (n == 2 || n == 3) return true;
    if (n % 2 == 0) return false;

    int limit = (int)Math.Sqrt(n);

    for (int i = 3; i <= limit; i += 2)
    {
        if (n % i == 0) return false;
    }

    return true;
}
  • Brug [Benchmark] attributten til at markere begge metoder, så de kan benchmarkes af BenchmarkDotNet.

  • Opret en Main metode, der kører benchmarket ved hjælp af BenchmarkRunner.Run().

  • Kør benchmarket og sammenlign resultaterne for de to metoder.

Klik for at se et forslag til en løsning
using System;
using BenchmarkDotNet.Attributes;
using BenchmarkDotNet.Running;

public class PrimeNumberBenchmark
{
    private const int PrimeNumber = 9973;

    [Benchmark]
    public bool IsPrimeSimple()
    {
        return IsPrimeSimple(PrimeNumber);
    }

    [Benchmark]
    public bool IsPrimeOptimized()
    {
        return IsPrimeOptimized(PrimeNumber);
    }

    private bool IsPrimeSimple(int n)
    {
        if (n <= 1) return false;

        for (int i = 2; i < n; i++)
        {
            if (n % i == 0) return false;
        }

        return true;
    }

    private bool IsPrimeOptimized(int n)
    {
        if (n <= 1) return false;
        if (n == 2 || n == 3) return true;
        if (n % 2 == 0) return false;

        int limit = (int)Math.Sqrt(n);

        for (int i = 3; i <= limit; i += 2)
        {
            if (n % i == 0) return false;
        }

        return true;
    }
}

class Program
{
    static void Main(string[] args)
    {
        var summary = BenchmarkRunner.Run<PrimeNumberBenchmark>();
    }
}

!!! Husk at afvikle koden i release (i VS kan du vælge konfiguration på øveste menu - på konsol kan du skrive dotnet run -c release)