#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();
}