2 разных теста с 2 разными переменными среды

#c# #performance #benchmarkdotnet

#c# #Производительность #benchmarkdotnet

Вопрос:

Пытаюсь выполнить бенчмарк функции drawManaged() , работающей в двух разных библиотеках DLL:

  • drawManaged() функция в C#
  • drawManaged() вызывает drawNative() в native1base.dll (или другие собственные библиотеки DLL) через swig-интерфейс
  • какая собственная DLL для загрузки настраивается с использованием переменных среды, %NATIVE_DLL_PATH%
  • хотите выполнить бенчмарк drawManaged() , работающий в 2 разных собственных DLL: native1base.dll и native2optimized.dll

как я могу это сделать, используя benchmarkdotnet?

Ответ №1:

Benchmarkdotnet будет проверять методы, помеченные атрибутом [Benchmark].

Возможно, было бы лучше создать небольшую утилиту (или directy в создаваемом вами проекте бенчмарка) для вызова этих функций. Попробуйте ограничить все переменные между каждым вызовом, поэтому вместо того, чтобы устанавливать переменную среды в собственных случаях, а затем напрямую вызывать функцию C #, сделайте так, чтобы методы, оформленные [Benchmark], вызывали только то, что вы хотите сравнить.

Ваш тест будет выглядеть примерно так:

     public class DrawManagedVsDrawNative
{
    private DrawManaged drawManaged = new DrawManaged();
    private DrawNative drawNative = new DrawNative();
    private byte[] data;


    [GlobalSetup]
    public void Setup()
    {
       // Some initialization here
    }

    [Benchmark]
    public byte[] DrawManaged() => drawManaged.Draw();

    [Benchmark]
    public byte[] DrawNative() => drawNative.Draw();
}
  

Есть больше декораторов и параметров конфигурации, которые benchmarkdotnet предлагает для вашего теста, обратитесь к документам для этого

Если вам действительно необходимо выполнить бенчмарк, установив переменные среды, вы можете создавать пользовательские задания, используя реализацию ManualConfig. Что-то вроде этого:

  [Config(typeof(ConfigWithCustomEnvVars))]
    public class DrawManagedVsDrawNative
    {
        private class ConfigWithCustomEnvVars : ManualConfig
        {
            private const string EnvVar = "Env_Var_Sample";

            public ConfigWithCustomEnvVars()
            {
                Add(Job.Core.WithId("Variable not set"));
                Add(Job.Core
                    .With(new[] { new EnvironmentVariable(EnvVar, "1") })
                    .WithId("Variable set"));
            }
        }

    private DrawManaged drawManaged = new DrawManaged();
    private DrawNative drawNative = new DrawNative();
    private byte[] data;


    [GlobalSetup]
    public void Setup()
    {
       // Some initialization here
    }

    [Benchmark]
    public byte[] DrawManaged() => drawManaged.Draw();

    [Benchmark]
    public byte[] DrawNative() => drawNative.Draw();

    }