casbin / Casbin.NET

An authorization library that supports access control models like ACL, RBAC, ABAC in .NET (C#)
https://casbin.org
Apache License 2.0
1.16k stars 111 forks source link

feat: Support lambda expression compile and delegate cache #207

Closed sagilio closed 3 years ago

sagilio commented 3 years ago

close #175 and #196

This PR can greatly improve performance (70% faster, and 75% lower allocation) in most cases.

Some test results on Github Actions. New:


BenchmarkDotNet=v0.13.0, OS=Windows 10.0.17763.2061 (1809/October2018Update/Redstone5)
Intel Xeon CPU E5-2673 v4 2.30GHz, 1 CPU, 2 logical and 2 physical cores
.NET SDK=6.0.100-preview.5.21302.13
  [Host]     : .NET 5.0.9 (5.0.921.35908), X64 RyuJIT
  Job-BHRCLC : .NET 5.0.9 (5.0.921.35908), X64 RyuJIT
  Job-ULIOOO : .NET 6.0.0 (6.0.21.30105), X64 RyuJIT
  Job-JEDSDX : .NET Core 3.1.18 (CoreCLR 4.700.21.35901, CoreFX 4.700.21.36305), X64 RyuJIT
  Job-QYLRWD : .NET Framework 4.8 (4.8.4400.0), X64 RyuJIT

IterationCount=10  RunStrategy=Throughput  
Method Job Runtime Mean Error StdDev Ratio RatioSD Gen 0 Gen 1 Gen 2 Allocated
BasicModel Job-BHRCLC .NET 5.0 739.8 ns 14.16 ns 8.43 ns 0.82 0.01 0.0057 - - 168 B
BasicModel Job-ULIOOO .NET 6.0 724.5 ns 14.92 ns 8.88 ns 0.80 0.01 0.0057 - - 168 B
BasicModel Job-JEDSDX .NET Core 3.1 899.8 ns 18.38 ns 12.16 ns 1.00 0.00 0.0057 - - 168 B
BasicModel Job-QYLRWD .NET Framework 4.8 1,014.8 ns 28.68 ns 18.97 ns 1.13 0.03 0.0191 - - 169 B
RbacModel Job-BHRCLC .NET 5.0 1,585.5 ns 23.16 ns 13.78 ns 0.85 0.01 0.0172 - - 496 B
RbacModel Job-ULIOOO .NET 6.0 1,562.2 ns 48.89 ns 32.34 ns 0.84 0.01 0.0172 - - 496 B
RbacModel Job-JEDSDX .NET Core 3.1 1,852.3 ns 18.86 ns 9.86 ns 1.00 0.00 0.0172 - - 496 B
RbacModel Job-QYLRWD .NET Framework 4.8 2,174.7 ns 36.28 ns 24.00 ns 1.18 0.02 0.0687 - - 514 B
RbacModelWithSmallScale Job-BHRCLC .NET 5.0 37,850.0 ns 697.32 ns 461.23 ns 0.86 0.02 0.4883 - - 13,448 B
RbacModelWithSmallScale Job-ULIOOO .NET 6.0 37,615.1 ns 1,159.40 ns 766.87 ns 0.86 0.02 0.4883 - - 13,448 B
RbacModelWithSmallScale Job-JEDSDX .NET Core 3.1 43,801.4 ns 1,027.15 ns 537.22 ns 1.00 0.00 0.4883 - - 13,448 B
RbacModelWithSmallScale Job-QYLRWD .NET Framework 4.8 57,811.1 ns 1,031.69 ns 682.40 ns 1.32 0.03 1.8921 - - 13,496 B
RbacModelWithMediumScale Job-BHRCLC .NET 5.0 371,371.7 ns 6,214.13 ns 3,250.11 ns 0.84 0.01 4.8828 - - 128,657 B
RbacModelWithMediumScale Job-ULIOOO .NET 6.0 366,571.6 ns 6,367.02 ns 4,211.39 ns 0.83 0.02 4.8828 - - 128,656 B
RbacModelWithMediumScale Job-JEDSDX .NET Core 3.1 443,785.0 ns 8,794.12 ns 5,816.76 ns 1.00 0.00 4.8828 - - 128,656 B
RbacModelWithMediumScale Job-QYLRWD .NET Framework 4.8 503,939.5 ns 13,873.82 ns 9,176.67 ns 1.14 0.03 18.5547 - - 137,003 B
RbacModelWithLargeScale Job-BHRCLC .NET 5.0 5,737,384.8 ns 174,378.40 ns 115,340.51 ns 1.26 0.04 46.8750 - - 1,359,859 B
RbacModelWithLargeScale Job-ULIOOO .NET 6.0 3,728,184.9 ns 80,392.85 ns 53,174.89 ns 0.82 0.04 50.7813 - - 1,359,858 B
RbacModelWithLargeScale Job-JEDSDX .NET Core 3.1 4,542,392.4 ns 254,774.25 ns 168,517.39 ns 1.00 0.00 46.8750 - - 1,359,884 B
RbacModelWithLargeScale Job-QYLRWD .NET Framework 4.8 5,174,098.4 ns 273,855.90 ns 181,138.72 ns 1.14 0.06 187.5000 - - 1,364,700 B
RbacModelWithResourceRoles Job-BHRCLC .NET 5.0 942.9 ns 23.06 ns 15.25 ns 0.83 0.02 0.0124 - - 344 B
RbacModelWithResourceRoles Job-ULIOOO .NET 6.0 913.0 ns 29.86 ns 17.77 ns 0.80 0.02 0.0124 - - 344 B
RbacModelWithResourceRoles Job-JEDSDX .NET Core 3.1 1,138.2 ns 18.83 ns 11.20 ns 1.00 0.00 0.0114 - - 344 B
RbacModelWithResourceRoles Job-QYLRWD .NET Framework 4.8 1,297.2 ns 35.71 ns 21.25 ns 1.14 0.02 0.0477 - - 345 B
RbacModelWithDomains Job-BHRCLC .NET 5.0 943.7 ns 22.06 ns 13.13 ns 0.81 0.02 0.0105 - - 288 B
RbacModelWithDomains Job-ULIOOO .NET 6.0 926.6 ns 19.14 ns 12.66 ns 0.80 0.01 0.0095 - - 288 B
RbacModelWithDomains Job-JEDSDX .NET Core 3.1 1,161.0 ns 21.63 ns 14.30 ns 1.00 0.00 0.0095 - - 288 B
RbacModelWithDomains Job-QYLRWD .NET Framework 4.8 1,313.1 ns 52.22 ns 34.54 ns 1.13 0.04 0.0381 - - 289 B
RbacModelWithDeny Job-BHRCLC .NET 5.0 2,412.8 ns 37.68 ns 19.71 ns 0.86 0.02 0.0267 - - 744 B
RbacModelWithDeny Job-ULIOOO .NET 6.0 2,401.3 ns 36.24 ns 23.97 ns 0.86 0.02 0.0267 - - 744 B
RbacModelWithDeny Job-JEDSDX .NET Core 3.1 2,807.9 ns 72.67 ns 43.24 ns 1.00 0.00 0.0267 - - 744 B
RbacModelWithDeny Job-QYLRWD .NET Framework 4.8 3,209.7 ns 83.44 ns 55.19 ns 1.14 0.03 0.1068 - - 770 B
AbacModel Job-BHRCLC .NET 5.0 5,544.6 ns 71.36 ns 37.32 ns 0.91 0.01 0.0610 - - 1,768 B
AbacModel Job-ULIOOO .NET 6.0 5,478.3 ns 101.69 ns 60.52 ns 0.90 0.02 0.0610 - - 1,728 B
AbacModel Job-JEDSDX .NET Core 3.1 6,102.3 ns 104.21 ns 68.93 ns 1.00 0.00 0.0687 - - 1,904 B
AbacModel Job-QYLRWD .NET Framework 4.8 7,047.9 ns 168.39 ns 111.38 ns 1.16 0.03 0.2899 - - 1,998 B
KeyMatchModel Job-BHRCLC .NET 5.0 1,127.1 ns 33.06 ns 21.87 ns 0.82 0.02 0.0172 - - 472 B
KeyMatchModel Job-ULIOOO .NET 6.0 1,096.9 ns 32.11 ns 21.24 ns 0.81 0.02 0.0172 - - 472 B
KeyMatchModel Job-JEDSDX .NET Core 3.1 1,364.4 ns 24.20 ns 14.40 ns 1.00 0.00 0.0210 - - 576 B
KeyMatchModel Job-QYLRWD .NET Framework 4.8 1,784.7 ns 59.39 ns 39.28 ns 1.31 0.04 0.1202 - - 802 B
PriorityModel Job-BHRCLC .NET 5.0 889.0 ns 21.33 ns 12.69 ns 0.84 0.02 0.0095 - - 256 B
PriorityModel Job-ULIOOO .NET 6.0 864.2 ns 19.20 ns 12.70 ns 0.82 0.01 0.0095 - - 256 B
PriorityModel Job-JEDSDX .NET Core 3.1 1,058.7 ns 30.62 ns 18.22 ns 1.00 0.00 0.0095 - - 256 B
PriorityModel Job-QYLRWD .NET Framework 4.8 1,227.5 ns 30.88 ns 18.38 ns 1.16 0.03 0.0343 - - 257 B

Old:


BenchmarkDotNet=v0.13.0, OS=Windows 10.0.17763.2061 (1809/October2018Update/Redstone5)
Intel Xeon Platinum 8171M CPU 2.60GHz, 1 CPU, 2 logical and 2 physical cores
.NET SDK=6.0.100-preview.5.21302.13
  [Host]     : .NET 5.0.8 (5.0.821.31504), X64 RyuJIT
  Job-ZMDPHO : .NET 5.0.8 (5.0.821.31504), X64 RyuJIT
  Job-XJIRZH : .NET 6.0.0 (6.0.21.30105), X64 RyuJIT
  Job-TEUVSW : .NET Core 3.1.17 (CoreCLR 4.700.21.31506, CoreFX 4.700.21.31502), X64 RyuJIT
  Job-YFNIIH : .NET Framework 4.8 (4.8.4390.0), X64 RyuJIT

IterationCount=10  RunStrategy=Throughput  
Method Job Runtime Mean Error StdDev Ratio RatioSD Gen 0 Gen 1 Gen 2 Allocated
BasicModel Job-ZMDPHO .NET 5.0 2.538 μs 0.0401 μs 0.0239 μs 0.88 0.02 0.0343 - - 648 B
BasicModel Job-XJIRZH .NET 6.0 2.546 μs 0.0454 μs 0.0300 μs 0.88 0.02 0.0343 - - 648 B
BasicModel Job-TEUVSW .NET Core 3.1 2.884 μs 0.1109 μs 0.0734 μs 1.00 0.00 0.0343 - - 648 B
BasicModel Job-YFNIIH .NET Framework 4.8 2.942 μs 0.0566 μs 0.0375 μs 1.02 0.03 0.0954 - - 650 B
RbacModel Job-ZMDPHO .NET 5.0 4.980 μs 0.0836 μs 0.0497 μs 0.89 0.01 0.0687 - - 1,424 B
RbacModel Job-XJIRZH .NET 6.0 5.002 μs 0.1026 μs 0.0679 μs 0.89 0.01 0.0687 - - 1,424 B
RbacModel Job-TEUVSW .NET Core 3.1 5.604 μs 0.0862 μs 0.0570 μs 1.00 0.00 0.0687 - - 1,424 B
RbacModel Job-YFNIIH .NET Framework 4.8 5.960 μs 0.1529 μs 0.1011 μs 1.06 0.02 0.2136 - - 1,444 B
RbacModelWithSmallScale Job-ZMDPHO .NET 5.0 128.449 μs 1.6012 μs 0.9528 μs 0.92 0.01 1.9531 - - 37,000 B
RbacModelWithSmallScale Job-XJIRZH .NET 6.0 125.981 μs 4.3016 μs 2.8452 μs 0.90 0.02 1.9531 - - 37,000 B
RbacModelWithSmallScale Job-TEUVSW .NET Core 3.1 139.536 μs 2.9159 μs 1.9287 μs 1.00 0.00 1.9531 - - 37,000 B
RbacModelWithSmallScale Job-YFNIIH .NET Framework 4.8 145.779 μs 5.0565 μs 3.3446 μs 1.05 0.03 5.3711 - - 37,117 B
RbacModelWithMediumScale Job-ZMDPHO .NET 5.0 1,203.039 μs 24.3302 μs 16.0929 μs 0.91 0.02 17.5781 - - 353,809 B
RbacModelWithMediumScale Job-XJIRZH .NET 6.0 1,184.049 μs 14.8462 μs 8.8347 μs 0.89 0.01 17.5781 - - 353,808 B
RbacModelWithMediumScale Job-TEUVSW .NET Core 3.1 1,323.839 μs 30.3102 μs 20.0483 μs 1.00 0.00 17.5781 - - 353,808 B
RbacModelWithMediumScale Job-YFNIIH .NET Framework 4.8 1,398.249 μs 23.7429 μs 15.7044 μs 1.06 0.02 52.7344 - - 362,825 B
RbacModelWithLargeScale Job-ZMDPHO .NET 5.0 12,681.453 μs 294.8946 μs 195.0545 μs 0.93 0.02 187.5000 - - 3,601,014 B
RbacModelWithLargeScale Job-XJIRZH .NET 6.0 12,243.931 μs 307.8025 μs 203.5923 μs 0.90 0.02 187.5000 - - 3,601,016 B
RbacModelWithLargeScale Job-TEUVSW .NET Core 3.1 13,669.813 μs 172.3955 μs 114.0290 μs 1.00 0.00 187.5000 - - 3,601,072 B
RbacModelWithLargeScale Job-YFNIIH .NET Framework 4.8 14,304.246 μs 139.8319 μs 92.4901 μs 1.05 0.01 531.2500 - - 3,612,494 B
RbacModelWithResourceRoles Job-ZMDPHO .NET 5.0 2.791 μs 0.0732 μs 0.0484 μs 0.90 0.03 0.0420 - - 824 B
RbacModelWithResourceRoles Job-XJIRZH .NET 6.0 2.718 μs 0.0345 μs 0.0228 μs 0.87 0.01 0.0420 - - 824 B
RbacModelWithResourceRoles Job-TEUVSW .NET Core 3.1 3.113 μs 0.0845 μs 0.0559 μs 1.00 0.00 0.0420 - - 824 B
RbacModelWithResourceRoles Job-YFNIIH .NET Framework 4.8 3.351 μs 0.0511 μs 0.0338 μs 1.08 0.02 0.1221 - - 826 B
RbacModelWithDomains Job-ZMDPHO .NET 5.0 13.446 μs 0.3268 μs 0.2162 μs 0.97 0.02 0.1984 - - 3,896 B
RbacModelWithDomains Job-XJIRZH .NET 6.0 12.782 μs 0.2792 μs 0.1847 μs 0.92 0.02 0.1984 - - 3,896 B
RbacModelWithDomains Job-TEUVSW .NET Core 3.1 13.913 μs 0.3036 μs 0.2008 μs 1.00 0.00 0.2136 - - 4,032 B
RbacModelWithDomains Job-YFNIIH .NET Framework 4.8 17.302 μs 0.5205 μs 0.3443 μs 1.24 0.03 0.5798 - - 4,052 B
RbacModelWithDeny Job-ZMDPHO .NET 5.0 45.409 μs 0.6577 μs 0.4350 μs 0.97 0.03 0.7324 - - 13,840 B
RbacModelWithDeny Job-XJIRZH .NET 6.0 42.530 μs 0.9247 μs 0.6117 μs 0.91 0.02 0.7324 - - 13,840 B
RbacModelWithDeny Job-TEUVSW .NET Core 3.1 46.609 μs 1.7122 μs 1.1325 μs 1.00 0.00 0.7324 - - 14,520 B
RbacModelWithDeny Job-YFNIIH .NET Framework 4.8 57.874 μs 1.5711 μs 1.0392 μs 1.24 0.04 2.1973 - - 14,628 B
AbacModel Job-ZMDPHO .NET 5.0 5.894 μs 0.1078 μs 0.0641 μs 0.96 0.01 0.0916 - - 1,736 B
AbacModel Job-XJIRZH .NET 6.0 5.635 μs 0.0927 μs 0.0552 μs 0.91 0.01 0.0839 - - 1,696 B
AbacModel Job-TEUVSW .NET Core 3.1 6.163 μs 0.1397 μs 0.0924 μs 1.00 0.00 0.0992 - - 1,872 B
AbacModel Job-YFNIIH .NET Framework 4.8 7.251 μs 0.2515 μs 0.1664 μs 1.18 0.03 0.2899 - - 1,966 B
KeyMatchModel Job-ZMDPHO .NET 5.0 3.042 μs 0.0509 μs 0.0337 μs 0.91 0.01 0.0496 - - 952 B
KeyMatchModel Job-XJIRZH .NET 6.0 2.982 μs 0.0814 μs 0.0538 μs 0.89 0.01 0.0496 - - 952 B
KeyMatchModel Job-TEUVSW .NET Core 3.1 3.348 μs 0.0617 μs 0.0367 μs 1.00 0.00 0.0534 - - 1,056 B
KeyMatchModel Job-YFNIIH .NET Framework 4.8 3.926 μs 0.0804 μs 0.0532 μs 1.17 0.02 0.1831 - - 1,284 B
PriorityModel Job-ZMDPHO .NET 5.0 10.630 μs 0.2153 μs 0.1424 μs 0.99 0.02 0.1526 - - 3,080 B
PriorityModel Job-XJIRZH .NET 6.0 9.924 μs 0.1780 μs 0.0931 μs 0.92 0.01 0.1526 - - 3,080 B
PriorityModel Job-TEUVSW .NET Core 3.1 10.768 μs 0.1584 μs 0.1048 μs 1.00 0.00 0.1678 - - 3,216 B
PriorityModel Job-YFNIIH .NET Framework 4.8 13.307 μs 0.3218 μs 0.2128 μs 1.24 0.02 0.4730 - - 3,234 B
hsluoyz commented 3 years ago

@huazhikui plz review

github-actions[bot] commented 3 years ago

:tada: This PR is included in version 1.11.0 :tada:

The release is available on GitHub release

Your semantic-release bot :package::rocket: