Правильный способ проверить производительность куска кода в C # - PullRequest
0 голосов
/ 18 апреля 2019

Просто предположим, что у меня есть два куска кода, и я хочу проверить использование ЦП и память этих кодов и сравнить их вместе, это хороший способ проверить производительность:

public class CodeChecker: IDisposable
{


    public PerformanceResult Check(Action<int> codeToTest, int loopLength)
    {

        var stopWatch = new Stopwatch();

        stopWatch.Start();

        for(var i = 0; i < loopLength; i++)
        {
            codeToTest.Invoke(i);
        }

        stopWatch.Stop();
        var process = Process.GetCurrentProcess();

        var result = new PerformanceResult(stopWatch.ElapsedMilliseconds, process.PrivateMemorySize64);
        return result;

    }
}

public class PerformanceResult
{
    public long DurationMilliseconds { get; set; }
    public long PrivateMemoryBytes { get; set; }

    public PerformanceResult(long durationMilliseconds, long privateMemoryBytes)
    {
        DurationMilliseconds = durationMilliseconds;
        PrivateMemoryBytes = privateMemoryBytes;
    }


    public override string ToString()
    {
        return $"Duration: {DurationMilliseconds} - Memory: {PrivateMemoryBytes}";
    }
}

И:

static void Main(string[] args)
{
    Console.WriteLine("Start!");
    int loopLength = 10000000;

    var collection = new Dictionary<int, Target>();


    PerformanceResult result;
    using (var codeChecker = new CodeChecker())
    {
        result = codeChecker.Check((int i) => collection.Add(i, new Target()) , loopLength);
    }

    Console.WriteLine($"Dict Performance: {result}");


    var list = new List<Target>();
    using(var codeChecker = new CodeChecker())
    {
        result = codeChecker.Check((int i) => list.Add(new Target()), loopLength);
    }

    Console.WriteLine($"List Performance: {result}");
    Console.ReadLine();
}

Я ищу программную проверку производительности и хочу проверить фрагмент кода, особенно не все приложения.

Есть предложения по улучшению вышеупомянутого кода?

И я открою любые предложения по использованию бесплатных инструментов.

1 Ответ

2 голосов
/ 18 апреля 2019

Существует множество факторов, которые могут повлиять на ваши измерения, включая влияние компилятора CLR и JIT, состояние кучи, холодный или горячий прогон, общую нагрузку в вашей системе и т. Д. В идеале вам нужно изолировать куски кода, которые вы 'мы хотели бы сравнивать друг с другом, чтобы исключить взаимное влияние, оценивать только горячие прогоны, не холодные, чтобы исключить компиляцию JIT и другие факторы холодного прогона, и, что наиболее важно, вам нужно провести несколько прогонов для получения статистической информации, поскольку отдельный прогон может быть не репрезентативнымособенно в системе, которая подразумевает многозадачность.К счастью, вам не нужно делать все вручную - есть отличная библиотека для бенчмаркинга, которая выполняет все упомянутые вещи и многое другое и которая широко используется в различных проектах .NET.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...