git/list[1] front-page[2] threads[3] people[4] search[5] about
 

[JGIT PATCH 03/11] Replace inefficient new String(String) constructor to silence FindBugs

From
Shawn O. Pearce <spearce@spearce.org>
Date
Apr 29, 2009, 18:54 UTC
Message-ID
<1241031288-23437-4-git-send-email-spearce@spearce.org>
In-Reply-To
<1241031288-23437-3-git-send-email-spearce@spearce.org>

FindBugs keeps reporting that our usage of new String(String) is not the most efficient way to construct a string.

http://thread.gmane.org/gmane.comp.version-control.git/113739/focus=113787
Show 11 quoted lines
> I had a specific reason for forcing a new String object here.
>
> The line in question, p, is from the packed-refs file and
> contains the entire SHA-1 in hex form at the beginning of it.
> We've converted that into binary as an ObjectId, it uses 1/4 the
> space of the string portion.
>
> The Ref object, its ObjectId, and its name string, are going to be
> cached in a Map, probably long-term.  We're better off shedding the
> 80 bytes of memory used to hold the hex SHA-1 then risk substring()
> deciding its "faster" to reuse the char[] then to make a copy of it.

Another way to force this new unique String instance with its own private char[] is to use a StringBuilder and append onto it the ref name. This shouldn't be a warning for FindBugs, but it would accomplish the same goal of producing 1 clean copy, with no extra transient temporary array.

Signed-off-by: Shawn O. Pearce <spearce@spearce.org>
CC: Yann Simon <yann.simon.fr@gmail.com>
CC: Matthias Sohn <matthias.sohn@sap.com>
---
 Unchanged.
 .../src/org/spearce/jgit/lib/RefDatabase.java      |    3 ++-
 1 files changed, 2 insertions(+), 1 deletions(-)
diff --git a/org.spearce.jgit/src/org/spearce/jgit/lib/RefDatabase.java b/org.spearce.jgit/src/org/spearce/jgit/lib/RefDatabase.java
index 87f26bf..bccf2d0 100644
--- a/org.spearce.jgit/src/org/spearce/jgit/lib/RefDatabase.java
+++ b/org.spearce.jgit/src/org/spearce/jgit/lib/RefDatabase.java
@@ -447,7 +447,8 @@ private synchronized void refreshPackedRefs() {
 
 					final int sp = p.indexOf(' ');
 					final ObjectId id = ObjectId.fromString(p.substring(0, sp));
-					final String name = new String(p.substring(sp + 1));
+					final String name = new StringBuilder(p.length() - (sp + 1))
+							.append(p, sp + 1, p.length()).toString();
 					last = new Ref(Ref.Storage.PACKED, name, name, id);
 					newPackedRefs.put(last.getName(), last);
 				}
-- 
1.6.3.rc3.199.g24398
Previous: Shawn O. PearceNext: Shawn O. Pearce
Message 4 of 13 in “WindowCache rewrite... with tests”
  1. 00/11 WindowCache rewrite... with testsShawn O. Pearce, Apr 29, 2009
  2. 01/11 Fix more computation of integer average overflowsShawn O. Pearce, Apr 29, 2009
  3. 02/11 Fix performance problem recently introduced to DeltaPackedObjectLoaderShawn O. Pearce, Apr 29, 2009
  4. 03/11 Replace inefficient new String(String) constructor to silence FindBugsShawn O. Pearce, Apr 29, 2009
  5. 04/11 Replace inefficient new Long(long) constructor to silence FindBugsShawn O. Pearce, Apr 29, 2009
  6. 05/11 Change IndexPack to use ObjectIdSubclassMap instead of ObjectIdMapShawn O. Pearce, Apr 29, 2009
  7. 06/11 Use getCachedBytes in IndexPack to avoid an unnecessary copyShawn O. Pearce, Apr 29, 2009
  8. 07/11 Remove ObjectIdMap from the JGit libraryShawn O. Pearce, Apr 29, 2009
  9. 08/11 Don't use ByteWindows when checking pack file headers/footersShawn O. Pearce, Apr 29, 2009
  10. 09/11 Rewrite WindowCache to be easier to follow and maintainShawn O. Pearce, Apr 29, 2009
  11. 10/11 Add tests for WindowCache.reconfigure casesShawn O. Pearce, Apr 29, 2009
  12. 11/11 Add tests to increase coverage of WindowCacheShawn O. Pearce, Apr 29, 2009
  13. Robin RosenbergApr 29, 2009

Read the whole thread, see it on lore, or plain text.

$ cat FOOTERMessages come from the public archive at lore.kernel.org/git, fetched every hour. The front page is chosen and written each morning by an AI editor and can be wrong; the threads themselves are the record. About and API. For agents: an MCP server at https://gitlist.dev/mcp, and any thread, story or person page as Markdown by adding .md to its URL (or sending Accept: text/markdown). Details in /llms.txt.