From 975671fa81f823643adf892f2af0e8120322e682 Mon Sep 17 00:00:00 2001 From: Ric Harris Date: Wed, 24 Apr 2024 16:56:27 +0100 Subject: [PATCH] Improve ClassPathManager performance, caching unfound entries Fixes #306 and adds a few small optimisations. Co-authored-by: Alexander Kriegisch Signed-off-by: Alexander Kriegisch --- .../aspectj/weaver/bcel/ClassPathManager.java | 33 ++++++++++++------- 1 file changed, 21 insertions(+), 12 deletions(-) diff --git a/weaver/src/main/java/org/aspectj/weaver/bcel/ClassPathManager.java b/weaver/src/main/java/org/aspectj/weaver/bcel/ClassPathManager.java index bfef435ec..1730e4b40 100644 --- a/weaver/src/main/java/org/aspectj/weaver/bcel/ClassPathManager.java +++ b/weaver/src/main/java/org/aspectj/weaver/bcel/ClassPathManager.java @@ -31,9 +31,11 @@ import java.nio.file.attribute.BasicFileAttributes; import java.util.ArrayList; import java.util.Enumeration; import java.util.HashMap; +import java.util.HashSet; import java.util.Iterator; import java.util.List; import java.util.Map; +import java.util.Set; import java.util.zip.ZipEntry; import java.util.zip.ZipFile; @@ -61,20 +63,22 @@ public class ClassPathManager { private static final int MAXOPEN_DEFAULT = 1000; - private List entries; + private final List entries; + + private final Set notFound = new HashSet<>(100); // In order to control how many open files we have, we maintain a list. // The max number is configured through the property: // org.aspectj.weaver.openarchives // and it defaults to 1000 - private List openArchives = new ArrayList<>(); + private final List openArchives = new ArrayList<>(); static { String openzipsString = getSystemPropertyWithoutSecurityException("org.aspectj.weaver.openarchives", Integer.toString(MAXOPEN_DEFAULT)); maxOpenArchives = Integer.parseInt(openzipsString); if (maxOpenArchives < 20) { - maxOpenArchives = 1000; + maxOpenArchives = MAXOPEN_DEFAULT; } } @@ -82,7 +86,7 @@ public class ClassPathManager { if (trace.isTraceEnabled()) { trace.enter("", this, new Object[] { classpath==null?"null":classpath.toString(), handler }); } - entries = new ArrayList<>(); + entries = new ArrayList<>(classpath == null ? 1 : classpath.size()); for (String classpathEntry: classpath) { addPath(classpathEntry,handler); } @@ -92,6 +96,7 @@ public class ClassPathManager { } protected ClassPathManager() { + entries = null; } public void addPath(String name, IMessageHandler handler) { @@ -127,6 +132,9 @@ public class ClassPathManager { trace.enter("find", this, type); } String name = type.getName(); + if (notFound.contains(name)) { + return null; + } for (Iterator i = entries.iterator(); i.hasNext();) { Entry entry = i.next(); try { @@ -151,6 +159,7 @@ public class ClassPathManager { if (trace.isTraceEnabled()) { trace.exit("find", null); } + notFound.add(name); return null; } @@ -181,9 +190,9 @@ public class ClassPathManager { static class ByteBasedClassFile extends ClassFile { - private byte[] bytes; + private final byte[] bytes; private ByteArrayInputStream bais; - private String path; + private final String path; public ByteBasedClassFile(byte[] bytes, String path) { this.bytes = bytes; @@ -215,7 +224,7 @@ public class ClassPathManager { } static class FileClassFile extends ClassFile { - private File file; + private final File file; private FileInputStream fis; public FileClassFile(File file) { @@ -247,7 +256,7 @@ public class ClassPathManager { } class DirEntry extends Entry { - private String dirPath; + private final String dirPath; public DirEntry(File dir) { this.dirPath = dir.getPath(); @@ -273,8 +282,8 @@ public class ClassPathManager { } static class ZipEntryClassFile extends ClassFile { - private ZipEntry entry; - private ZipFileEntry zipFile; + private final ZipEntry entry; + private final ZipFileEntry zipFile; private InputStream is; public ZipEntryClassFile(ZipFileEntry zipFile, ZipEntry entry) { @@ -407,7 +416,7 @@ public class ClassPathManager { class TypeIdentifier extends SimpleFileVisitor { // What are we looking for? - private String name; + private final String name; // If set, where did we find it? public Path found; @@ -586,7 +595,7 @@ public class ClassPathManager { } /* private */static boolean hasClassExtension(String name) { - return name.toLowerCase().endsWith((".class")); + return name.toLowerCase().endsWith(".class"); } public void closeArchives() { -- 2.39.5