blob: 5f2365dfc48239c6374f159849f7c5cebf6e73b2 [file] [log] [blame]
using System;
using System.Collections.Generic;
using System.Threading.Tasks;
using BenchmarkDotNet.Attributes;
using BenchmarkDotNet.Engines;
using BenchmarkDotNet.Jobs;
using Casbin.Model;
namespace Casbin.Benchmark
{
[MemoryDiagnoser]
[BenchmarkCategory("Model")]
[SimpleJob(RunStrategy.Throughput, RuntimeMoniker.Net48)]
[SimpleJob(RunStrategy.Throughput, RuntimeMoniker.Net60, baseline: true)]
[SimpleJob(RunStrategy.Throughput, RuntimeMoniker.Net70)]
[SimpleJob(RunStrategy.Throughput, RuntimeMoniker.Net80)]
public class DefaultPolicyManagerBenchmark
{
private readonly Enforcer _enforcer;
private readonly DefaultPolicyManager _policyManager;
public DefaultPolicyManagerBenchmark()
{
_enforcer = new Enforcer(TestHelper.GetTestFilePath("rbac_model.conf"));
_policyManager = (DefaultPolicyManager)_enforcer.Model.Sections
.GetPolicyAssertion(PermConstants.DefaultPolicyType).PolicyManager;
}
private string NowTestUserName { get; set; }
private string NowTestDataName { get; set; }
private IPolicyValues NowTestPolicy { get; set; }
private List<IPolicyValues> NowTestExistedPolicyList { get; set; } = new List<IPolicyValues>();
private List<IPolicyValues> NowTestNullPolicyList { get; set; } = new List<IPolicyValues>();
[Params(10, 100, 1000, 10000)] public int NowPolicyCount { get; set; }
[GlobalSetup(Targets = new[]
{
nameof(AddPolicyAsync), nameof(RemovePolicyAsync), nameof(UpdatePolicyAsync),
nameof(RemovePoliciesAsync), nameof(AddPoliciesAsync), nameof(UpdatePoliciesAsync)
})]
public void GlobalSetup()
{
var rd = new Random();
for (int i = 0; i < NowPolicyCount; i++)
{
_enforcer.AddPolicy($"group{i}", $"obj{i / 10}", "read");
int num = rd.Next(1000);
if (num == 0)
{
NowTestExistedPolicyList.Add(
new PolicyValues<string, string, string>($"group{i}", $"obj{i / 10}", "read"));
NowTestNullPolicyList.Add(
new PolicyValues<string, string, string>($"name{i}", $"data{i / 10}", "read"));
}
}
Console.WriteLine($"// Already set {NowPolicyCount} policies.");
NowTestUserName = $"name{NowPolicyCount / 2 + 1}";
NowTestDataName = $"data{NowPolicyCount / 2 + 1}";
NowTestPolicy = new PolicyValues<string, string, string>(NowTestUserName, NowTestDataName, "read");
Console.WriteLine($"// Already set user name to {NowTestUserName}.");
Console.WriteLine($"// Already set data name to {NowTestDataName}.");
}
[Benchmark]
[BenchmarkCategory("ModelManagement")]
public async Task AddPolicyAsync()
{
await _policyManager.AddPolicyAsync(NowTestPolicy);
}
[Benchmark]
[BenchmarkCategory("ModelManagement")]
public async Task RemovePolicyAsync()
{
await _policyManager.RemovePolicyAsync(NowTestPolicy);
}
[Benchmark]
[BenchmarkCategory("ModelManagement")]
public async Task UpdatePolicyAsync()
{
await _policyManager.UpdatePolicyAsync(NowTestPolicy,
new PolicyValues<string, string, string>(NowTestUserName + "up", NowTestDataName + "up", "read"));
}
[Benchmark]
[BenchmarkCategory("ModelManagement")]
public async Task RemovePoliciesAsync()
{
await _policyManager.RemovePoliciesAsync(NowTestExistedPolicyList);
}
[Benchmark]
[BenchmarkCategory("ModelManagement")]
public async Task AddPoliciesAsync()
{
await _policyManager.AddPoliciesAsync(NowTestNullPolicyList);
}
[Benchmark]
[BenchmarkCategory("ModelManagement")]
public async Task UpdatePoliciesAsync()
{
await _policyManager.UpdatePoliciesAsync(NowTestExistedPolicyList, NowTestNullPolicyList);
}
}
}