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

@ -102,19 +102,13 @@ public class RefNames {
}
public static String changeMetaRef(Change.Id id) {
StringBuilder r = new StringBuilder();
r.append(REFS_CHANGES);
r.append(shard(id.get()));
r.append(META_SUFFIX);
return r.toString();
StringBuilder r = newStringBuilder().append(REFS_CHANGES);
return shard(id.get(), r).append(META_SUFFIX).toString();
}
public static String robotCommentsRef(Change.Id id) {
StringBuilder r = new StringBuilder();
r.append(REFS_CHANGES);
r.append(shard(id.get()));
r.append(ROBOT_COMMENTS_SUFFIX);
return r.toString();
StringBuilder r = newStringBuilder().append(REFS_CHANGES);
return shard(id.get(), r).append(ROBOT_COMMENTS_SUFFIX).toString();
}
public static boolean isNoteDbMetaRef(String ref) {
@ -129,16 +123,12 @@ public class RefNames {
}
public static String refsUsers(Account.Id accountId) {
StringBuilder r = new StringBuilder();
r.append(REFS_USERS);
r.append(shard(accountId.get()));
return r.toString();
StringBuilder r = newStringBuilder().append(REFS_USERS);
return shard(accountId.get(), r).toString();
}
public static String refsDraftComments(Change.Id changeId, Account.Id accountId) {
StringBuilder r = buildRefsPrefix(REFS_DRAFT_COMMENTS, changeId.get());
r.append(accountId.get());
return r.toString();
return buildRefsPrefix(REFS_DRAFT_COMMENTS, changeId.get()).append(accountId.get()).toString();
}
public static String refsDraftCommentsPrefix(Change.Id changeId) {
@ -146,9 +136,7 @@ public class RefNames {
}
public static String refsStarredChanges(Change.Id changeId, Account.Id accountId) {
StringBuilder r = buildRefsPrefix(REFS_STARRED_CHANGES, changeId.get());
r.append(accountId.get());
return r.toString();
return buildRefsPrefix(REFS_STARRED_CHANGES, changeId.get()).append(accountId.get()).toString();
}
public static String refsStarredChangesPrefix(Change.Id changeId) {
@ -156,11 +144,8 @@ public class RefNames {
}
private static StringBuilder buildRefsPrefix(String prefix, int id) {
StringBuilder r = new StringBuilder();
r.append(prefix);
r.append(shard(id));
r.append('/');
return r;
StringBuilder r = newStringBuilder().append(prefix);
return shard(id, r).append('/');
}
public static String refsCacheAutomerge(String hash) {
@ -171,15 +156,18 @@ public class RefNames {
if (id < 0) {
return null;
}
StringBuilder r = new StringBuilder();
return shard(id, newStringBuilder()).toString();
}
private static StringBuilder shard(int id, StringBuilder sb) {
int n = id % 100;
if (n < 10) {
r.append('0');
sb.append('0');
}
r.append(n);
r.append('/');
r.append(id);
return r.toString();
sb.append(n);
sb.append('/');
sb.append(id);
return sb;
}
/**
@ -363,5 +351,12 @@ public class RefNames {
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() {}
}