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