RefNames: Avoid StringBuilder copying

Presize all StringBuilders to 64 chars. The default for StringBuilder is
16, but pretty much all refs are longer than this, e.g.
"refs/changes/01/1" is already 17. The longest ref in this file
currently is cache-automerge at 62, followed by robot-comments at 32+;
64 is enough for now.

Add a variant of shard that takes a StringBuilder, since most places
within this file already have their own.

Change-Id: I7050620ca55266c8cff179902d564ce118c12806
This commit is contained in:
Dave Borowitz
2017-08-25 13:47:07 -04:00
parent 4a9159e52b
commit aa75aac57d

View File

@@ -102,19 +102,13 @@ public class RefNames {
} }
public static String changeMetaRef(Change.Id id) { public static String changeMetaRef(Change.Id id) {
StringBuilder r = new StringBuilder(); StringBuilder r = newStringBuilder().append(REFS_CHANGES);
r.append(REFS_CHANGES); return shard(id.get(), r).append(META_SUFFIX).toString();
r.append(shard(id.get()));
r.append(META_SUFFIX);
return r.toString();
} }
public static String robotCommentsRef(Change.Id id) { public static String robotCommentsRef(Change.Id id) {
StringBuilder r = new StringBuilder(); StringBuilder r = newStringBuilder().append(REFS_CHANGES);
r.append(REFS_CHANGES); return shard(id.get(), r).append(ROBOT_COMMENTS_SUFFIX).toString();
r.append(shard(id.get()));
r.append(ROBOT_COMMENTS_SUFFIX);
return r.toString();
} }
public static boolean isNoteDbMetaRef(String ref) { public static boolean isNoteDbMetaRef(String ref) {
@@ -129,16 +123,12 @@ public class RefNames {
} }
public static String refsUsers(Account.Id accountId) { public static String refsUsers(Account.Id accountId) {
StringBuilder r = new StringBuilder(); StringBuilder r = newStringBuilder().append(REFS_USERS);
r.append(REFS_USERS); return shard(accountId.get(), r).toString();
r.append(shard(accountId.get()));
return r.toString();
} }
public static String refsDraftComments(Change.Id changeId, Account.Id accountId) { public static String refsDraftComments(Change.Id changeId, Account.Id accountId) {
StringBuilder r = buildRefsPrefix(REFS_DRAFT_COMMENTS, changeId.get()); return buildRefsPrefix(REFS_DRAFT_COMMENTS, changeId.get()).append(accountId.get()).toString();
r.append(accountId.get());
return r.toString();
} }
public static String refsDraftCommentsPrefix(Change.Id changeId) { public static String refsDraftCommentsPrefix(Change.Id changeId) {
@@ -146,9 +136,7 @@ public class RefNames {
} }
public static String refsStarredChanges(Change.Id changeId, Account.Id accountId) { public static String refsStarredChanges(Change.Id changeId, Account.Id accountId) {
StringBuilder r = buildRefsPrefix(REFS_STARRED_CHANGES, changeId.get()); return buildRefsPrefix(REFS_STARRED_CHANGES, changeId.get()).append(accountId.get()).toString();
r.append(accountId.get());
return r.toString();
} }
public static String refsStarredChangesPrefix(Change.Id changeId) { public static String refsStarredChangesPrefix(Change.Id changeId) {
@@ -156,11 +144,8 @@ public class RefNames {
} }
private static StringBuilder buildRefsPrefix(String prefix, int id) { private static StringBuilder buildRefsPrefix(String prefix, int id) {
StringBuilder r = new StringBuilder(); StringBuilder r = newStringBuilder().append(prefix);
r.append(prefix); return shard(id, r).append('/');
r.append(shard(id));
r.append('/');
return r;
} }
public static String refsCacheAutomerge(String hash) { public static String refsCacheAutomerge(String hash) {
@@ -171,15 +156,18 @@ public class RefNames {
if (id < 0) { if (id < 0) {
return null; return null;
} }
StringBuilder r = new StringBuilder(); return shard(id, newStringBuilder()).toString();
}
private static StringBuilder shard(int id, StringBuilder sb) {
int n = id % 100; int n = id % 100;
if (n < 10) { if (n < 10) {
r.append('0'); sb.append('0');
} }
r.append(n); sb.append(n);
r.append('/'); sb.append('/');
r.append(id); sb.append(id);
return r.toString(); return sb;
} }
/** /**
@@ -363,5 +351,12 @@ public class RefNames {
return Integer.valueOf(name.substring(i, name.length())); return Integer.valueOf(name.substring(i, name.length()));
} }
private static StringBuilder newStringBuilder() {
// Many refname types in this file are always are longer than the default of 16 chars, so
// presize StringBuilders larger by default. This hurts readability less than accurate
// calculations would, at a negligible cost to memory overhead.
return new StringBuilder(64);
}
private RefNames() {} private RefNames() {}
} }