]> source.dussan.org Git - jgit.git/commitdiff
[performance] Remove synthetic access$ methods in dfs, diff and merge 74/59174/1
authorAndrey Loskutov <loskutov@gmx.de>
Wed, 28 Oct 2015 20:17:43 +0000 (21:17 +0100)
committerAndrey Loskutov <loskutov@gmx.de>
Wed, 28 Oct 2015 20:18:23 +0000 (21:18 +0100)
Java compiler must generate synthetic access methods for private methods
and fields of the enclosing class if they are accessed from inner
classes and vice versa.

While invisible in the code, those synthetic access methods exist in the
bytecode and seem to produce some extra execution overhead at runtime
(compared with the direct access to this fields or methods), see
https://git.eclipse.org/r/58948/.

By removing the "private" access modifier from affected methods and
fields we help compiler to avoid generation of synthetic access methods
and hope to improve execution performance.

To validate changes, one can either use javap or use Bytecode Outline
plugin in Eclipse. In both cases one should look for "synthetic
access$<number>" methods at the end of the class and inner class files
in question - there should be none.

NB: don't mix this "synthetic access$" methods up with "public synthetic
bridge" methods generated to allow generic method override return types.

Change-Id: I94fb481b68c84841c1db1a5ebe678b13e13c962b
Signed-off-by: Andrey Loskutov <loskutov@gmx.de>
org.eclipse.jgit/src/org/eclipse/jgit/diff/ContentSource.java
org.eclipse.jgit/src/org/eclipse/jgit/diff/HistogramDiff.java
org.eclipse.jgit/src/org/eclipse/jgit/internal/storage/dfs/DfsInserter.java
org.eclipse.jgit/src/org/eclipse/jgit/internal/storage/dfs/InMemoryRepository.java
org.eclipse.jgit/src/org/eclipse/jgit/merge/MergeResult.java

index 3c780e7d8890258035d5201f436311fa473c12c2..0dc4b0578708aa3e743d60531d489129d6ab5ca4 100644 (file)
@@ -148,7 +148,7 @@ public abstract class ContentSource {
 
                private String current;
 
-               private WorkingTreeIterator ptr;
+               WorkingTreeIterator ptr;
 
                WorkingTreeSource(WorkingTreeIterator iterator) {
                        this.tw = new TreeWalk((ObjectReader) null);
index e57faaf858399363f338dd8199a2160fef5d870e..2f5c9ea84ce68d62b728bf4cce9d39e0ae0df595 100644 (file)
@@ -94,7 +94,7 @@ import java.util.List;
  */
 public class HistogramDiff extends LowLevelDiffAlgorithm {
        /** Algorithm to use when there are too many element occurrences. */
-       private DiffAlgorithm fallback = MyersDiff.INSTANCE;
+       DiffAlgorithm fallback = MyersDiff.INSTANCE;
 
        /**
         * Maximum number of positions to consider for a given element hash.
@@ -103,7 +103,7 @@ public class HistogramDiff extends LowLevelDiffAlgorithm {
         * size is capped to ensure search is linear time at O(len_A + len_B) rather
         * than quadratic at O(len_A * len_B).
         */
-       private int maxChainLength = 64;
+       int maxChainLength = 64;
 
        /**
         * Set the algorithm used when there are too many element occurrences.
index 488eee97942041ebce002ab0951b6e6f66181a05..aea453e81f0f2cedcbe93cf42b870786373c1f06 100644 (file)
@@ -95,16 +95,16 @@ public class DfsInserter extends ObjectInserter {
        /** Always produce version 2 indexes, to get CRC data. */
        private static final int INDEX_VERSION = 2;
 
-       private final DfsObjDatabase db;
-       private int compression = Deflater.BEST_COMPRESSION;
+       final DfsObjDatabase db;
+       int compression = Deflater.BEST_COMPRESSION;
 
-       private List<PackedObjectInfo> objectList;
-       private ObjectIdOwnerMap<PackedObjectInfo> objectMap;
+       List<PackedObjectInfo> objectList;
+       ObjectIdOwnerMap<PackedObjectInfo> objectMap;
 
-       private DfsBlockCache cache;
-       private DfsPackKey packKey;
-       private DfsPackDescription packDsc;
-       private PackStream packOut;
+       DfsBlockCache cache;
+       DfsPackKey packKey;
+       DfsPackDescription packDsc;
+       PackStream packOut;
        private boolean rollback;
 
        /**
@@ -322,7 +322,7 @@ public class DfsInserter extends ObjectInserter {
        private class PackStream extends OutputStream {
                private final DfsOutputStream out;
                private final MessageDigest md;
-               private final byte[] hdrBuf;
+               final byte[] hdrBuf;
                private final Deflater deflater;
                private final int blockSize;
 
index 8e7af0d2909c1efded76560305509b317e3b1b4a..832e4fb6a84a4ff5c1d35b7c4a9b1fb5d9c4fcde 100644 (file)
@@ -43,7 +43,7 @@ public class InMemoryRepository extends DfsRepository {
                }
        }
 
-       private static final AtomicInteger packId = new AtomicInteger();
+       static final AtomicInteger packId = new AtomicInteger();
 
        private final DfsObjDatabase objdb;
 
@@ -60,7 +60,7 @@ public class InMemoryRepository extends DfsRepository {
                this(new Builder().setRepositoryDescription(repoDesc));
        }
 
-       private InMemoryRepository(Builder builder) {
+       InMemoryRepository(Builder builder) {
                super(builder);
                objdb = new MemObjDatabase(this);
                refdb = new MemRefDatabase();
@@ -139,7 +139,7 @@ public class InMemoryRepository extends DfsRepository {
        }
 
        private static class MemPack extends DfsPackDescription {
-               private final Map<PackExt, byte[]>
+               final Map<PackExt, byte[]>
                                fileMap = new HashMap<PackExt, byte[]>();
 
                MemPack(String name, DfsRepositoryDescription repoDesc) {
index dc3c772efb1337458933e26a770bbca99d4ff343..106f9c779650200c86ff17b45fc21097c074f7e5 100644 (file)
@@ -70,7 +70,7 @@ import org.eclipse.jgit.util.IntList;
 public class MergeResult<S extends Sequence> implements Iterable<MergeChunk> {
        private final List<S> sequences;
 
-       private final IntList chunks = new IntList();
+       final IntList chunks = new IntList();
 
        private boolean containsConflicts = false;
 
@@ -127,7 +127,7 @@ public class MergeResult<S extends Sequence> implements Iterable<MergeChunk> {
                return sequences;
        }
 
-       private static final ConflictState[] states = ConflictState.values();
+       static final ConflictState[] states = ConflictState.values();
 
        /**
         * @return an iterator over the MergeChunks. The iterator does not support