Skip to content

perf: optimize HasLink concurrency with double-checked reading#1698

Open
AKonnyaku wants to merge 1 commit intoapache:masterfrom
AKonnyaku:haslink-test
Open

perf: optimize HasLink concurrency with double-checked reading#1698
AKonnyaku wants to merge 1 commit intoapache:masterfrom
AKonnyaku:haslink-test

Conversation

@AKonnyaku
Copy link
Contributor

This pull request improves the performance of the HasLink method in the default role manager under high concurrency.

  • The original implementation employed a global write lock for every query, which caused severe blocking during parallel read operations.
  • A double-checked reading strategy is introduced to prioritize a read lock for the fast path when both roles already exist.
  • The write lock is now reserved strictly for the slow path where temporary roles must be created or modified.
  • CPU profiling confirms that the bottleneck caused by sync.RWMutex.Lock and runtime.procyield is effectively eliminated.
  • Benchmark results verify a significant reduction in latency, as shown in the raw data: 816.7 ns/op decreases to 166.6 ns/op.

@github-actions
Copy link

Benchmark Comparison

Comparing base branch (0fe9505)
vs PR branch (eb96ce2)

goos: linux
goarch: amd64
pkg: github.com/casbin/casbin/v3
cpu: AMD EPYC 7763 64-Core Processor                
                                                 │ base-bench.txt │             pr-bench.txt             │
                                                 │     sec/op     │    sec/op     vs base                      Diff          │
CachedRaw                                          15.38n ± ∞ ¹   15.36n ± ∞ ¹       ~ (p=1.000 n=1) ²         -0.13% ➡️
CachedBasicModel                                   175.2n ± ∞ ¹   167.1n ± ∞ ¹       ~ (p=1.000 n=1) ²         -4.62% ➡️
CachedRBACModel                                    177.8n ± ∞ ¹   177.7n ± ∞ ¹       ~ (p=1.000 n=1) ²         -0.06% ➡️
CachedRBACModelSmall                               179.9n ± ∞ ¹   174.7n ± ∞ ¹       ~ (p=1.000 n=1) ²         -2.89% ➡️
CachedRBACModelMedium                              193.4n ± ∞ ¹   181.8n ± ∞ ¹       ~ (p=1.000 n=1) ²         -6.00% ➡️
CachedRBACModelLarge                               157.4n ± ∞ ¹   162.1n ± ∞ ¹       ~ (p=1.000 n=1) ²         +2.99% ➡️
CachedRBACModelWithResourceRoles                   180.7n ± ∞ ¹   169.3n ± ∞ ¹       ~ (p=1.000 n=1) ²         -6.31% ➡️
CachedRBACModelWithDomains                         182.2n ± ∞ ¹   181.6n ± ∞ ¹       ~ (p=1.000 n=1) ²         -0.33% ➡️
CachedABACModel                                    2.755µ ± ∞ ¹   2.786µ ± ∞ ¹       ~ (p=1.000 n=1) ²         +1.13% ➡️
CachedKeyMatchModel                                193.3n ± ∞ ¹   185.0n ± ∞ ¹       ~ (p=1.000 n=1) ²         -4.29% ➡️
CachedRBACModelWithDeny                            175.0n ± ∞ ¹   169.3n ± ∞ ¹       ~ (p=1.000 n=1) ²         -3.26% ➡️
CachedPriorityModel                                176.4n ± ∞ ¹   174.0n ± ∞ ¹       ~ (p=1.000 n=1) ²         -1.36% ➡️
CachedWithEnforceContext                           248.4n ± ∞ ¹   241.2n ± ∞ ¹       ~ (p=1.000 n=1) ²         -2.90% ➡️
CachedRBACModelMediumParallel                      171.7n ± ∞ ¹   168.9n ± ∞ ¹       ~ (p=1.000 n=1) ²         -1.63% ➡️
HasPolicySmall                                     433.5n ± ∞ ¹   430.8n ± ∞ ¹       ~ (p=1.000 n=1) ²         -0.62% ➡️
HasPolicyMedium                                    439.9n ± ∞ ¹   441.2n ± ∞ ¹       ~ (p=1.000 n=1) ²         +0.30% ➡️
HasPolicyLarge                                     479.3n ± ∞ ¹   464.9n ± ∞ ¹       ~ (p=1.000 n=1) ²         -3.00% ➡️
AddPolicySmall                                     536.1n ± ∞ ¹   536.6n ± ∞ ¹       ~ (p=1.000 n=1) ²         +0.09% ➡️
AddPolicyMedium                                    627.8n ± ∞ ¹   631.1n ± ∞ ¹       ~ (p=1.000 n=1) ²         +0.53% ➡️
AddPolicyLarge                                     1.175µ ± ∞ ¹   1.156µ ± ∞ ¹       ~ (p=1.000 n=1) ²         -1.62% ➡️
RemovePolicySmall                                  521.3n ± ∞ ¹   519.8n ± ∞ ¹       ~ (p=1.000 n=1) ²         -0.29% ➡️
RemovePolicyMedium                                 550.3n ± ∞ ¹   564.2n ± ∞ ¹       ~ (p=1.000 n=1) ²         +2.53% ➡️
RemovePolicyLarge                                  597.7n ± ∞ ¹   579.5n ± ∞ ¹       ~ (p=1.000 n=1) ²         -3.05% ➡️
Raw                                                15.08n ± ∞ ¹   15.10n ± ∞ ¹       ~ (p=1.000 n=1) ²         +0.13% ➡️
BasicModel                                         3.686µ ± ∞ ¹   3.675µ ± ∞ ¹       ~ (p=1.000 n=1) ²         -0.30% ➡️
RBACModel                                          5.431µ ± ∞ ¹   5.415µ ± ∞ ¹       ~ (p=1.000 n=1) ²         -0.29% ➡️
RBACModelSizes/small                               49.05µ ± ∞ ¹   47.72µ ± ∞ ¹       ~ (p=1.000 n=1) ²         -2.71% ➡️
RBACModelSizes/medium                              483.9µ ± ∞ ¹   473.5µ ± ∞ ¹       ~ (p=1.000 n=1) ²         -2.15% ➡️
RBACModelSizes/large                               5.388m ± ∞ ¹   5.309m ± ∞ ¹       ~ (p=1.000 n=1) ²         -1.47% ➡️
RBACModelSmall                                     58.17µ ± ∞ ¹   56.41µ ± ∞ ¹       ~ (p=1.000 n=1) ²         -3.03% ➡️
RBACModelMedium                                    549.7µ ± ∞ ¹   552.1µ ± ∞ ¹       ~ (p=1.000 n=1) ²         +0.44% ➡️
RBACModelLarge                                     5.875m ± ∞ ¹   5.728m ± ∞ ¹       ~ (p=1.000 n=1) ²         -2.50% ➡️
RBACModelWithResourceRoles                         4.523µ ± ∞ ¹   4.429µ ± ∞ ¹       ~ (p=1.000 n=1) ²         -2.08% ➡️
RBACModelWithDomains                               5.050µ ± ∞ ¹   5.014µ ± ∞ ¹       ~ (p=1.000 n=1) ²         -0.71% ➡️
ABACModel                                          2.777µ ± ∞ ¹   2.730µ ± ∞ ¹       ~ (p=1.000 n=1) ²         -1.69% ➡️
ABACRuleModel                                      4.046m ± ∞ ¹   4.022m ± ∞ ¹       ~ (p=1.000 n=1) ²         -0.59% ➡️
KeyMatchModel                                      6.146µ ± ∞ ¹   6.070µ ± ∞ ¹       ~ (p=1.000 n=1) ²         -1.24% ➡️
RBACModelWithDeny                                  6.914µ ± ∞ ¹   6.808µ ± ∞ ¹       ~ (p=1.000 n=1) ²         -1.53% ➡️
PriorityModel                                      4.169µ ± ∞ ¹   4.143µ ± ∞ ¹       ~ (p=1.000 n=1) ²         -0.62% ➡️
RBACModelWithDomainPatternLarge                    13.03µ ± ∞ ¹   12.90µ ± ∞ ¹       ~ (p=1.000 n=1) ²         -1.00% ➡️
RoleManagerSmall                                   47.57µ ± ∞ ¹   47.36µ ± ∞ ¹       ~ (p=1.000 n=1) ²         -0.44% ➡️
RoleManagerMedium                                  536.7µ ± ∞ ¹   525.9µ ± ∞ ¹       ~ (p=1.000 n=1) ²         -2.01% ➡️
RoleManagerLarge                                   5.775m ± ∞ ¹   5.860m ± ∞ ¹       ~ (p=1.000 n=1) ²         +1.47% ➡️
BuildRoleLinksWithPatternLarge                     287.7m ± ∞ ¹   288.5m ± ∞ ¹       ~ (p=1.000 n=1) ²         +0.28% ➡️
BuildRoleLinksWithDomainPatternLarge               9.118m ± ∞ ¹   9.319m ± ∞ ¹       ~ (p=1.000 n=1) ²         +2.20% ➡️
BuildRoleLinksWithPatternAndDomainPatternLarge     294.3m ± ∞ ¹   296.3m ± ∞ ¹       ~ (p=1.000 n=1) ²         +0.68% ➡️
HasLinkWithPatternLarge                            985.0n ± ∞ ¹   994.6n ± ∞ ¹       ~ (p=1.000 n=1) ²         +0.97% ➡️
HasLinkWithDomainPatternLarge                      343.5n ± ∞ ¹   334.6n ± ∞ ¹       ~ (p=1.000 n=1) ²         -2.59% ➡️
HasLinkWithPatternAndDomainPatternLarge            982.6n ± ∞ ¹   979.0n ± ∞ ¹       ~ (p=1.000 n=1) ²         -0.37% ➡️
ConcurrentHasLinkWithMatching                      1.222µ ± ∞ ¹   1.259µ ± ∞ ¹       ~ (p=1.000 n=1) ²         +3.03% ➡️
geomean                                              4.983µ         4.929µ                                     -1.08% ➡️
¹ need >= 6 samples for confidence interval at level 0.95
² need >= 4 samples to detect a difference at alpha level 0.05

                                                 │ base-bench.txt │             pr-bench.txt              │
                                                 │      B/op      │     B/op       vs base                     Diff          │
CachedRaw                                           0.000 ± ∞ ¹     0.000 ± ∞ ¹       ~ (p=1.000 n=1) ²        +0.00% ➡️
CachedBasicModel                                    104.0 ± ∞ ¹     104.0 ± ∞ ¹       ~ (p=1.000 n=1) ²        +0.00% ➡️
CachedRBACModel                                     104.0 ± ∞ ¹     104.0 ± ∞ ¹       ~ (p=1.000 n=1) ²        +0.00% ➡️
CachedRBACModelSmall                                104.0 ± ∞ ¹     104.0 ± ∞ ¹       ~ (p=1.000 n=1) ²        +0.00% ➡️
CachedRBACModelMedium                               104.0 ± ∞ ¹     104.0 ± ∞ ¹       ~ (p=1.000 n=1) ²        +0.00% ➡️
CachedRBACModelLarge                                96.00 ± ∞ ¹     96.00 ± ∞ ¹       ~ (p=1.000 n=1) ²        +0.00% ➡️
CachedRBACModelWithResourceRoles                    104.0 ± ∞ ¹     104.0 ± ∞ ¹       ~ (p=1.000 n=1) ²        +0.00% ➡️
CachedRBACModelWithDomains                          120.0 ± ∞ ¹     120.0 ± ∞ ¹       ~ (p=1.000 n=1) ²        +0.00% ➡️
CachedABACModel                                   1.510Ki ± ∞ ¹   1.515Ki ± ∞ ¹       ~ (p=1.000 n=1) ³        +0.33% ➡️
CachedKeyMatchModel                                 152.0 ± ∞ ¹     152.0 ± ∞ ¹       ~ (p=1.000 n=1) ²        +0.00% ➡️
CachedRBACModelWithDeny                             104.0 ± ∞ ¹     104.0 ± ∞ ¹       ~ (p=1.000 n=1) ²        +0.00% ➡️
CachedPriorityModel                                 104.0 ± ∞ ¹     104.0 ± ∞ ¹       ~ (p=1.000 n=1) ²        +0.00% ➡️
CachedWithEnforceContext                            176.0 ± ∞ ¹     176.0 ± ∞ ¹       ~ (p=1.000 n=1) ²        +0.00% ➡️
CachedRBACModelMediumParallel                       104.0 ± ∞ ¹     104.0 ± ∞ ¹       ~ (p=1.000 n=1) ²        +0.00% ➡️
HasPolicySmall                                      102.0 ± ∞ ¹     102.0 ± ∞ ¹       ~ (p=1.000 n=1) ²        +0.00% ➡️
HasPolicyMedium                                     109.0 ± ∞ ¹     109.0 ± ∞ ¹       ~ (p=1.000 n=1) ²        +0.00% ➡️
HasPolicyLarge                                      117.0 ± ∞ ¹     117.0 ± ∞ ¹       ~ (p=1.000 n=1) ²        +0.00% ➡️
AddPolicySmall                                      152.0 ± ∞ ¹     152.0 ± ∞ ¹       ~ (p=1.000 n=1) ²        +0.00% ➡️
AddPolicyMedium                                     166.0 ± ∞ ¹     166.0 ± ∞ ¹       ~ (p=1.000 n=1) ²        +0.00% ➡️
AddPolicyLarge                                      406.0 ± ∞ ¹     407.0 ± ∞ ¹       ~ (p=1.000 n=1) ³        +0.25% ➡️
RemovePolicySmall                                   166.0 ± ∞ ¹     166.0 ± ∞ ¹       ~ (p=1.000 n=1) ²        +0.00% ➡️
RemovePolicyMedium                                  174.0 ± ∞ ¹     174.0 ± ∞ ¹       ~ (p=1.000 n=1) ²        +0.00% ➡️
RemovePolicyLarge                                   181.0 ± ∞ ¹     181.0 ± ∞ ¹       ~ (p=1.000 n=1) ²        +0.00% ➡️
Raw                                                 0.000 ± ∞ ¹     0.000 ± ∞ ¹       ~ (p=1.000 n=1) ²        +0.00% ➡️
BasicModel                                        1.488Ki ± ∞ ¹   1.489Ki ± ∞ ¹       ~ (p=1.000 n=1) ³        +0.07% ➡️
RBACModel                                         2.031Ki ± ∞ ¹   2.036Ki ± ∞ ¹       ~ (p=1.000 n=1) ³        +0.25% ➡️
RBACModelSizes/small                              19.79Ki ± ∞ ¹   19.80Ki ± ∞ ¹       ~ (p=1.000 n=1) ³        +0.05% ➡️
RBACModelSizes/medium                             187.2Ki ± ∞ ¹   187.2Ki ± ∞ ¹       ~ (p=1.000 n=1) ³        +0.00% ➡️
RBACModelSizes/large                              1.810Mi ± ∞ ¹   1.810Mi ± ∞ ¹       ~ (p=1.000 n=1) ³        +0.00% ➡️
RBACModelSmall                                    19.77Ki ± ∞ ¹   19.91Ki ± ∞ ¹       ~ (p=1.000 n=1) ³        +0.71% ➡️
RBACModelMedium                                   189.9Ki ± ∞ ¹   189.9Ki ± ∞ ¹       ~ (p=1.000 n=1) ³        +0.00% ➡️
RBACModelLarge                                    1.840Mi ± ∞ ¹   1.840Mi ± ∞ ¹       ~ (p=1.000 n=1) ³        +0.00% ➡️
RBACModelWithResourceRoles                        1.811Ki ± ∞ ¹   1.812Ki ± ∞ ¹       ~ (p=1.000 n=1) ³        +0.06% ➡️
RBACModelWithDomains                              1.800Ki ± ∞ ¹   1.803Ki ± ∞ ¹       ~ (p=1.000 n=1) ³        +0.17% ➡️
ABACModel                                         1.504Ki ± ∞ ¹   1.508Ki ± ∞ ¹       ~ (p=1.000 n=1) ³        +0.27% ➡️
ABACRuleModel                                     1.248Mi ± ∞ ¹   1.253Mi ± ∞ ¹       ~ (p=1.000 n=1) ³        +0.40% ➡️
KeyMatchModel                                     3.016Ki ± ∞ ¹   3.017Ki ± ∞ ¹       ~ (p=1.000 n=1) ³        +0.03% ➡️
RBACModelWithDeny                                 2.440Ki ± ∞ ¹   2.445Ki ± ∞ ¹       ~ (p=1.000 n=1) ³        +0.20% ➡️
PriorityModel                                     1.735Ki ± ∞ ¹   1.738Ki ± ∞ ¹       ~ (p=1.000 n=1) ³        +0.17% ➡️
RBACModelWithDomainPatternLarge                   8.689Ki ± ∞ ¹   8.692Ki ± ∞ ¹       ~ (p=1.000 n=1) ³        +0.03% ➡️
RoleManagerSmall                                    800.0 ± ∞ ¹     800.0 ± ∞ ¹       ~ (p=1.000 n=1) ²        +0.00% ➡️
RoleManagerMedium                                 13.63Ki ± ∞ ¹   13.63Ki ± ∞ ¹       ~ (p=1.000 n=1) ²        +0.00% ➡️
RoleManagerLarge                                  224.6Ki ± ∞ ¹   224.6Ki ± ∞ ¹       ~ (p=1.000 n=1) ²        +0.00% ➡️
BuildRoleLinksWithPatternLarge                    60.80Mi ± ∞ ¹   60.86Mi ± ∞ ¹       ~ (p=1.000 n=1) ³        +0.10% ➡️
BuildRoleLinksWithDomainPatternLarge              3.949Mi ± ∞ ¹   3.949Mi ± ∞ ¹       ~ (p=1.000 n=1) ³        +0.00% ➡️
BuildRoleLinksWithPatternAndDomainPatternLarge    62.42Mi ± ∞ ¹   62.46Mi ± ∞ ¹       ~ (p=1.000 n=1) ³        +0.06% ➡️
HasLinkWithPatternLarge                             112.0 ± ∞ ¹     112.0 ± ∞ ¹       ~ (p=1.000 n=1) ²        +0.00% ➡️
HasLinkWithDomainPatternLarge                       16.00 ± ∞ ¹     16.00 ± ∞ ¹       ~ (p=1.000 n=1) ²        +0.00% ➡️
HasLinkWithPatternAndDomainPatternLarge             112.0 ± ∞ ¹     112.0 ± ∞ ¹       ~ (p=1.000 n=1) ²        +0.00% ➡️
ConcurrentHasLinkWithMatching                       736.0 ± ∞ ¹     736.0 ± ∞ ¹       ~ (p=1.000 n=1) ²        +0.00% ➡️
geomean                                                         ⁴                                              +0.06% ➡️               ⁴
¹ need >= 6 samples for confidence interval at level 0.95
² all samples are equal
³ need >= 4 samples to detect a difference at alpha level 0.05
⁴ summaries must be >0 to compute geomean

                                                 │ base-bench.txt │             pr-bench.txt             │
                                                 │   allocs/op    │  allocs/op    vs base                      Diff          │
CachedRaw                                           0.000 ± ∞ ¹    0.000 ± ∞ ¹       ~ (p=1.000 n=1) ²         +0.00% ➡️
CachedBasicModel                                    4.000 ± ∞ ¹    4.000 ± ∞ ¹       ~ (p=1.000 n=1) ²         +0.00% ➡️
CachedRBACModel                                     4.000 ± ∞ ¹    4.000 ± ∞ ¹       ~ (p=1.000 n=1) ²         +0.00% ➡️
CachedRBACModelSmall                                4.000 ± ∞ ¹    4.000 ± ∞ ¹       ~ (p=1.000 n=1) ²         +0.00% ➡️
CachedRBACModelMedium                               4.000 ± ∞ ¹    4.000 ± ∞ ¹       ~ (p=1.000 n=1) ²         +0.00% ➡️
CachedRBACModelLarge                                3.000 ± ∞ ¹    3.000 ± ∞ ¹       ~ (p=1.000 n=1) ²         +0.00% ➡️
CachedRBACModelWithResourceRoles                    4.000 ± ∞ ¹    4.000 ± ∞ ¹       ~ (p=1.000 n=1) ²         +0.00% ➡️
CachedRBACModelWithDomains                          4.000 ± ∞ ¹    4.000 ± ∞ ¹       ~ (p=1.000 n=1) ²         +0.00% ➡️
CachedABACModel                                     18.00 ± ∞ ¹    18.00 ± ∞ ¹       ~ (p=1.000 n=1) ²         +0.00% ➡️
CachedKeyMatchModel                                 4.000 ± ∞ ¹    4.000 ± ∞ ¹       ~ (p=1.000 n=1) ²         +0.00% ➡️
CachedRBACModelWithDeny                             4.000 ± ∞ ¹    4.000 ± ∞ ¹       ~ (p=1.000 n=1) ²         +0.00% ➡️
CachedPriorityModel                                 4.000 ± ∞ ¹    4.000 ± ∞ ¹       ~ (p=1.000 n=1) ²         +0.00% ➡️
CachedWithEnforceContext                            4.000 ± ∞ ¹    4.000 ± ∞ ¹       ~ (p=1.000 n=1) ²         +0.00% ➡️
CachedRBACModelMediumParallel                       4.000 ± ∞ ¹    4.000 ± ∞ ¹       ~ (p=1.000 n=1) ²         +0.00% ➡️
HasPolicySmall                                      4.000 ± ∞ ¹    4.000 ± ∞ ¹       ~ (p=1.000 n=1) ²         +0.00% ➡️
HasPolicyMedium                                     4.000 ± ∞ ¹    4.000 ± ∞ ¹       ~ (p=1.000 n=1) ²         +0.00% ➡️
HasPolicyLarge                                      5.000 ± ∞ ¹    5.000 ± ∞ ¹       ~ (p=1.000 n=1) ²         +0.00% ➡️
AddPolicySmall                                      6.000 ± ∞ ¹    6.000 ± ∞ ¹       ~ (p=1.000 n=1) ²         +0.00% ➡️
AddPolicyMedium                                     7.000 ± ∞ ¹    7.000 ± ∞ ¹       ~ (p=1.000 n=1) ²         +0.00% ➡️
AddPolicyLarge                                      9.000 ± ∞ ¹    9.000 ± ∞ ¹       ~ (p=1.000 n=1) ²         +0.00% ➡️
RemovePolicySmall                                   7.000 ± ∞ ¹    7.000 ± ∞ ¹       ~ (p=1.000 n=1) ²         +0.00% ➡️
RemovePolicyMedium                                  7.000 ± ∞ ¹    7.000 ± ∞ ¹       ~ (p=1.000 n=1) ²         +0.00% ➡️
RemovePolicyLarge                                   8.000 ± ∞ ¹    8.000 ± ∞ ¹       ~ (p=1.000 n=1) ²         +0.00% ➡️
Raw                                                 0.000 ± ∞ ¹    0.000 ± ∞ ¹       ~ (p=1.000 n=1) ²         +0.00% ➡️
BasicModel                                          18.00 ± ∞ ¹    18.00 ± ∞ ¹       ~ (p=1.000 n=1) ²         +0.00% ➡️
RBACModel                                           36.00 ± ∞ ¹    36.00 ± ∞ ¹       ~ (p=1.000 n=1) ²         +0.00% ➡️
RBACModelSizes/small                                481.0 ± ∞ ¹    481.0 ± ∞ ¹       ~ (p=1.000 n=1) ²         +0.00% ➡️
RBACModelSizes/medium                              4.829k ± ∞ ¹   4.830k ± ∞ ¹       ~ (p=1.000 n=1) ³         +0.02% ➡️
RBACModelSizes/large                               48.12k ± ∞ ¹   48.11k ± ∞ ¹       ~ (p=1.000 n=1) ³         -0.02% ➡️
RBACModelSmall                                      616.0 ± ∞ ¹    616.0 ± ∞ ¹       ~ (p=1.000 n=1) ²         +0.00% ➡️
RBACModelMedium                                    6.016k ± ∞ ¹   6.016k ± ∞ ¹       ~ (p=1.000 n=1) ²         +0.00% ➡️
RBACModelLarge                                     60.08k ± ∞ ¹   60.08k ± ∞ ¹       ~ (p=1.000 n=1) ³         +0.00% ➡️
RBACModelWithResourceRoles                          28.00 ± ∞ ¹    28.00 ± ∞ ¹       ~ (p=1.000 n=1) ²         +0.00% ➡️
RBACModelWithDomains                                26.00 ± ∞ ¹    26.00 ± ∞ ¹       ~ (p=1.000 n=1) ²         +0.00% ➡️
ABACModel                                           17.00 ± ∞ ¹    17.00 ± ∞ ¹       ~ (p=1.000 n=1) ²         +0.00% ➡️
ABACRuleModel                                      37.09k ± ∞ ¹   37.09k ± ∞ ¹       ~ (p=1.000 n=1) ³         +0.00% ➡️
KeyMatchModel                                       38.00 ± ∞ ¹    38.00 ± ∞ ¹       ~ (p=1.000 n=1) ²         +0.00% ➡️
RBACModelWithDeny                                   50.00 ± ∞ ¹    50.00 ± ∞ ¹       ~ (p=1.000 n=1) ²         +0.00% ➡️
PriorityModel                                       23.00 ± ∞ ¹    23.00 ± ∞ ¹       ~ (p=1.000 n=1) ²         +0.00% ➡️
RBACModelWithDomainPatternLarge                     73.00 ± ∞ ¹    73.00 ± ∞ ¹       ~ (p=1.000 n=1) ²         +0.00% ➡️
RoleManagerSmall                                    100.0 ± ∞ ¹    100.0 ± ∞ ¹       ~ (p=1.000 n=1) ²         +0.00% ➡️
RoleManagerMedium                                  1.744k ± ∞ ¹   1.744k ± ∞ ¹       ~ (p=1.000 n=1) ²         +0.00% ➡️
RoleManagerLarge                                   19.74k ± ∞ ¹   19.74k ± ∞ ¹       ~ (p=1.000 n=1) ²         +0.00% ➡️
BuildRoleLinksWithPatternLarge                     3.560M ± ∞ ¹   3.560M ± ∞ ¹       ~ (p=1.000 n=1) ³         +0.00% ➡️
BuildRoleLinksWithDomainPatternLarge               120.2k ± ∞ ¹   120.2k ± ∞ ¹       ~ (p=1.000 n=1) ³         +0.00% ➡️
BuildRoleLinksWithPatternAndDomainPatternLarge     3.637M ± ∞ ¹   3.637M ± ∞ ¹       ~ (p=1.000 n=1) ³         +0.00% ➡️
HasLinkWithPatternLarge                             9.000 ± ∞ ¹    9.000 ± ∞ ¹       ~ (p=1.000 n=1) ²         +0.00% ➡️
HasLinkWithDomainPatternLarge                       1.000 ± ∞ ¹    1.000 ± ∞ ¹       ~ (p=1.000 n=1) ²         +0.00% ➡️
HasLinkWithPatternAndDomainPatternLarge             9.000 ± ∞ ¹    9.000 ± ∞ ¹       ~ (p=1.000 n=1) ²         +0.00% ➡️
ConcurrentHasLinkWithMatching                       11.00 ± ∞ ¹    11.00 ± ∞ ¹       ~ (p=1.000 n=1) ²         +0.00% ➡️
geomean                                                         ⁴                                              -0.00% ➡️               ⁴
¹ need >= 6 samples for confidence interval at level 0.95
² all samples are equal
³ need >= 4 samples to detect a difference at alpha level 0.05
⁴ summaries must be >0 to compute geomean

🤖 This comment will be automatically updated with the latest benchmark results.

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

None yet

Projects

None yet

Development

Successfully merging this pull request may close these issues.

1 participant