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:
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() {}
|
||||
}
|
||||
|
Loading…
x
Reference in New Issue
Block a user