Dear security-devs, While benchmarking various parts of our code, I noticed unexpected (but fully explainable) behavior of how an instance of the Subject class can be created.
The intuitive one is to create a set of Principals and then pass it to the constructor. However, it turned out that creating an empty subject and populating it with desire principles is much faster: Benchmark Mode Cnt Score Error Units SubjectBenchmark.subjectByAddingToSet thrpt 9 2061025.436 ± 24807.881 ops/s SubjectBenchmark.subjectByPassingSet thrpt 9 1341492.178 ± 34701.882 ops/s The reason is that the Subject class performs extra checks on the provided set, which first creates a null-clean LinkedList copy of the collection. Makes sense. However, `Set#of` returns immutable, null clean sets, so there is no reason for an extra copy. Best regards, Tigran. The benchmark code: ``` @BenchmarkMode(Mode.Throughput) @State(Scope.Benchmark) public class SubjectBenchmark { @Benchmark public Subject subjectByAddingToSet() { Subject subject = new Subject(); subject.getPrincipals().add(new UnixNumericUserPrincipal(0)); subject.getPrincipals().add(new UnixNumericGroupPrincipal(0, true)); subject.getPrincipals().add(new UnixNumericGroupPrincipal(1, false)); subject.getPrincipals().add(new UnixNumericGroupPrincipal(2, false)); subject.getPrincipals().add(new UnixNumericGroupPrincipal(3, false)); subject.getPrincipals().add(new UnixNumericGroupPrincipal(4, false)); subject.getPrincipals().add(new UnixNumericGroupPrincipal(5, false)); subject.getPrincipals().add(new UnixNumericGroupPrincipal(6, false)); subject.setReadOnly(); return subject; } @Benchmark public Subject subjectByPassingSet() { Principal[] principals = new Principal[]{ new UnixNumericUserPrincipal(0), new UnixNumericGroupPrincipal(0, true), new UnixNumericGroupPrincipal(1, false), new UnixNumericGroupPrincipal(2, false), new UnixNumericGroupPrincipal(3, false), new UnixNumericGroupPrincipal(4, false), new UnixNumericGroupPrincipal(5, false), new UnixNumericGroupPrincipal(6, false) }; return new Subject(true, Set.of(principals), Set.of(), Set.of()); } } ```
smime.p7s
Description: S/MIME Cryptographic Signature