Skip to content

Commit b8df7d8

Browse files
authored
fix: optimize enforce method by moving common code before 'for' loop (casbin#341)
* perf: Optimize enforce method by moving common code before 'for' loop. BenchmarkABACModel shows about 7% decrease of average operation time. * build: Make InternalEnforcerWithDispatcherTest compile with Java 17.
1 parent 5cb8846 commit b8df7d8

File tree

2 files changed

+25
-24
lines changed

2 files changed

+25
-24
lines changed

src/main/java/org/casbin/jcasbin/main/CoreEnforcer.java

+24-22
Original file line numberDiff line numberDiff line change
@@ -502,25 +502,28 @@ private EnforceResult enforce(String matcher, Object... rvals) {
502502

503503
Effect[] policyEffects;
504504
float[] matcherResults;
505-
int policyLen, explainIndex = -1;
506-
if ((policyLen = model.model.get("p").get(pType).policy.size()) != 0) {
505+
final List<List<String>> policy = model.model.get("p").get(pType).policy;
506+
final String[] pTokens = model.model.get("p").get(pType).tokens;
507+
final int policyLen = policy.size();
508+
int explainIndex = -1;
509+
510+
if (policyLen != 0) {
507511
policyEffects = new Effect[policyLen];
508512
matcherResults = new float[policyLen];
509513

510-
for (int i = 0; i < model.model.get("p").get(pType).policy.size(); i++) {
511-
List<String> pvals = model.model.get("p").get(pType).policy.get(i);
512-
if (model.model.get("p").get(pType).tokens.length != pvals.size()) {
513-
throw new CasbinMatcherException("invalid request size: expected " + model.model.get("p").get(pType).tokens.length +
514+
for (int i = 0; i < policy.size(); i++) {
515+
List<String> pvals = policy.get(i);
516+
if (pTokens.length != pvals.size()) {
517+
throw new CasbinMatcherException("invalid request size: expected " + pTokens.length +
514518
", got " + pvals.size() + ", rvals: " + Arrays.toString(rvals));
515519
}
516520

517521
// Util.logPrint("Policy Rule: " + pvals);
518522
// Select the rule based on request size
519-
Map<String, Object> parameters = new HashMap<>();
523+
Map<String, Object> parameters = new HashMap<>(rvals.length + pTokens.length);
520524
getRTokens(parameters, rvals);
521-
for (int j = 0; j < model.model.get("p").get(pType).tokens.length; j++) {
522-
String token = model.model.get("p").get(pType).tokens[j];
523-
parameters.put(token, pvals.get(j));
525+
for (int j = 0; j < pTokens.length; j++) {
526+
parameters.put(pTokens[j], pvals.get(j));
524527
}
525528

526529
Object result = expression.execute(parameters);
@@ -575,13 +578,13 @@ private EnforceResult enforce(String matcher, Object... rvals) {
575578
policyEffects = new Effect[1];
576579
matcherResults = new float[1];
577580

578-
Map<String, Object> parameters = new HashMap<>();
579-
for (int j = 0; j < model.model.get("r").get(rType).tokens.length; j++) {
580-
String token = model.model.get("r").get(rType).tokens[j];
581-
parameters.put(token, rvals[j]);
581+
String[] rTokens = model.model.get("r").get(rType).tokens;
582+
Map<String, Object> parameters = new HashMap<>(rTokens.length + pTokens.length);
583+
584+
for (int j = 0; j < rTokens.length; j++) {
585+
parameters.put(rTokens[j], rvals[j]);
582586
}
583-
for (int j = 0; j < model.model.get("p").get(pType).tokens.length; j++) {
584-
String token = model.model.get("p").get(pType).tokens[j];
587+
for (String token : pTokens) {
585588
parameters.put(token, "");
586589
}
587590

@@ -613,7 +616,7 @@ private EnforceResult enforce(String matcher, Object... rvals) {
613616

614617
List<String> explain = new ArrayList<>();
615618
if (explainIndex != -1) {
616-
explain.addAll(model.model.get("p").get(pType).policy.get(explainIndex));
619+
explain.addAll(policy.get(explainIndex));
617620
}
618621

619622
Util.logEnforce(rvals, result, explain);
@@ -705,15 +708,14 @@ public boolean addNamedDomainMatchingFunc(String ptype, String name, BiPredicate
705708
}
706709

707710
private void getRTokens(Map<String, Object> parameters, Object... rvals) {
708-
for (String rKey : model.model.get("r").keySet()) {
709-
if (!(rvals.length == model.model.get("r").get(rKey).tokens.length)) {
711+
for (Assertion assertion : model.model.get("r").values()) {
712+
if (!(rvals.length == assertion.tokens.length)) {
710713
continue;
711714
}
712-
for (int j = 0; j < model.model.get("r").get(rKey).tokens.length; j++) {
713-
String token = model.model.get("r").get(rKey).tokens[j];
715+
for (int j = 0; j < assertion.tokens.length; j++) {
716+
String token = assertion.tokens[j];
714717
parameters.put(token, rvals[j]);
715718
}
716-
717719
}
718720
}
719721

src/test/java/org/casbin/jcasbin/main/InternalEnforcerWithDispatcherTest.java

+1-2
Original file line numberDiff line numberDiff line change
@@ -3,7 +3,6 @@
33
import org.casbin.jcasbin.persist.Dispatcher;
44
import org.junit.Before;
55
import org.junit.Test;
6-
import sun.reflect.generics.reflectiveObjects.NotImplementedException;
76

87
import java.util.List;
98

@@ -111,7 +110,7 @@ public void removeFilteredPolicy(
111110

112111
@Override
113112
public void clearPolicy() {
114-
throw new NotImplementedException();
113+
throw new UnsupportedOperationException();
115114
}
116115

117116
@Override

0 commit comments

Comments
 (0)