Minimize reading of all refs from disk When displaying the commit log, all refs was fetch from the repository for each of the 20 most recent commits displayed. By not destroying the Builder objects unneccesarily often we can cache the refs and reuse them for each commit. On heavy gits with a lot of refs, we could fetch the page 20 times faster than before. Change-Id: Ief060002b295abfe0ca01d194504c95502891e39
diff --git a/gitiles-servlet/src/main/java/com/google/gitiles/CommitSoyData.java b/gitiles-servlet/src/main/java/com/google/gitiles/CommitSoyData.java index 733da0a..9e5a9fe 100644 --- a/gitiles-servlet/src/main/java/com/google/gitiles/CommitSoyData.java +++ b/gitiles-servlet/src/main/java/com/google/gitiles/CommitSoyData.java
@@ -56,6 +56,7 @@ private Linkifier linkifier; private RevWalk walk; + private CommitData.Builder cdb; private ArchiveFormat archiveFormat; CommitSoyData setLinkifier(@Nullable Linkifier linkifier) { @@ -76,7 +77,11 @@ Map<String, Object> toSoyData(HttpServletRequest req, RevCommit c, Set<Field> fs, DateFormatter df) throws IOException { GitilesView view = ViewFilter.getView(req); - CommitData cd = new CommitData.Builder() + if (cdb == null) { + cdb = new CommitData.Builder(); + } + + CommitData cd = cdb .setRevWalk(walk) .setArchiveFormat(archiveFormat) .build(req, c, fs);
diff --git a/gitiles-servlet/src/main/java/com/google/gitiles/LogSoyData.java b/gitiles-servlet/src/main/java/com/google/gitiles/LogSoyData.java index 244bbc8..0508561 100644 --- a/gitiles-servlet/src/main/java/com/google/gitiles/LogSoyData.java +++ b/gitiles-servlet/src/main/java/com/google/gitiles/LogSoyData.java
@@ -47,6 +47,7 @@ private final Set<Field> fields; private final String pretty; private final String variant; + private CommitSoyData csd; public LogSoyData(HttpServletRequest req, GitilesAccess access, String pretty) throws IOException { @@ -97,7 +98,11 @@ private Map<String, Object> toEntrySoyData(Paginator paginator, RevCommit c, DateFormatter df, boolean first) throws IOException { - Map<String, Object> entry = new CommitSoyData().setRevWalk(paginator.getWalk()) + if (csd == null) { + csd = new CommitSoyData(); + } + + Map<String, Object> entry = csd.setRevWalk(paginator.getWalk()) .toSoyData(req, c, fields, df); return ImmutableMap.of( "firstWithPrevious", first && paginator.getPreviousStart() != null,