using System.Collections.Generic;
using System.Collections.Immutable;
using BenchmarkDotNet.Attributes;
using BenchmarkDotNet.Running;
public static void Main(string[] args)
_ = BenchmarkRunner.Run<Benchmarks>();
public ImmutableArray<int> RequiredPermissions { get; set; }
public ImmutableArray<int> UserPermissions { get; set; }
[Params(1, 10, 100, 1000, 10000)]
public int Iterations { get; set; }
RequiredPermissions = PopulateRequiredPermissions();
UserPermissions = PopulateUserPermissions();
private static ImmutableArray<int> PopulateRequiredPermissions()
var requiredPermissions = ImmutableArray.CreateBuilder<int>();
requiredPermissions.Add((int)Permission.AllClient);
requiredPermissions.Add((int)Permission.ViewSupplier);
return requiredPermissions.ToImmutable();
private static ImmutableArray<int> PopulateUserPermissions()
var random = new Random();
var userPermissions = ImmutableArray.CreateBuilder<int>();
while (userPermissions.Count < 4)
var range1 = random.Next(10000, 10004);
if (!userPermissions.Contains(range1))
userPermissions.Add(range1);
var range2 = random.Next(20000, 20004);
if (!userPermissions.Contains(range2))
userPermissions.Add(range2);
return userPermissions.ToImmutable();
public void PassingEnumParamsV1()
for (var iteration = 0; iteration < Iterations; iteration++)
_ = HasPermissionV1(Permission.AllSupplier, Permission.ViewSupplier);
public void PassingImmutableArrayV1()
for (var iteration = 0; iteration < Iterations; iteration++)
_ = HasPermissionV1(RequiredPermissions);
public void PassingEnumParamsV2()
for (var iteration = 0; iteration < Iterations; iteration++)
_ = HasPermissionV2(Permission.AllSupplier, Permission.ViewSupplier);
public void PassingImmutableArrayV2()
for (var iteration = 0; iteration < Iterations; iteration++)
_ = HasPermissionV2(RequiredPermissions);
public bool HasPermissionV1(params object[] permissions)
if (permissions.Length == 0)
if (permissions[0] is ImmutableArray<int> array)
foreach (var permission in array)
if (UserPermissions.Contains(permission))
foreach (int permission in permissions)
if (UserPermissions.Contains(permission))
public bool HasPermissionV2(params object[] permissions)
return HasPermissionV2(Cast());
foreach (object permission in permissions)
yield return (int)permission;
public bool HasPermissionV2(IEnumerable<int> permissions)
foreach (int permission in permissions)
if (!UserPermissions.Contains(permission))