* [JGIT PATCH v3] Replace inefficient new String(String) constructor to silence FindBugs
@ 2009-05-01 15:54 Shawn O. Pearce
2009-05-04 21:23 ` Sohn, Matthias
0 siblings, 1 reply; 2+ messages in thread
From: Shawn O. Pearce @ 2009-05-01 15:54 UTC (permalink / raw)
To: Robin Rosenberg; +Cc: git, Yann Simon, Matthias Sohn
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
> 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>
---
A less ugly version ?
.../src/org/spearce/jgit/lib/RefDatabase.java | 9 ++++++++-
1 files changed, 8 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..a865fba 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,7 @@ 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 = copy(p.substring(sp + 1));
last = new Ref(Ref.Storage.PACKED, name, name, id);
newPackedRefs.put(last.getName(), last);
}
@@ -469,6 +469,13 @@ private synchronized void refreshPackedRefs() {
}
}
+ private static String copy(final String src) {
+ // Force a deep copy of the underlying char[] so that we can
+ // discard any garbage from any shared char[] within src.
+ //
+ return new StringBuilder(src.length()).append(src).toString();
+ }
+
private void lockAndWriteFile(File file, byte[] content) throws IOException {
String name = file.getName();
final LockFile lck = new LockFile(file);
--
1.6.3.rc3.212.g8c698
^ permalink raw reply related [flat|nested] 2+ messages in thread
* RE: [JGIT PATCH v3] Replace inefficient new String(String) constructor to silence FindBugs
2009-05-01 15:54 [JGIT PATCH v3] Replace inefficient new String(String) constructor to silence FindBugs Shawn O. Pearce
@ 2009-05-04 21:23 ` Sohn, Matthias
0 siblings, 0 replies; 2+ messages in thread
From: Sohn, Matthias @ 2009-05-04 21:23 UTC (permalink / raw)
To: Shawn O. Pearce; +Cc: git, Yann Simon, Robin Rosenberg
Shawn O. Pearce [mailto:spearce@spearce.org] wrote :
> 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
> > 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>
> ---
>
> A less ugly version ?
I agree, this looks better than the previous proposal but still a simple
String copy constructor looks even simpler.
I tried the alternative approach Robin proposed using FindBugs filter
mechanisms to suppress the undesired warning. I will post that in my
next mail.
--
Matthias
^ permalink raw reply [flat|nested] 2+ messages in thread
end of thread, other threads:[~2009-05-04 21:24 UTC | newest]
Thread overview: 2+ messages (download: mbox.gz / follow: Atom feed)
-- links below jump to the message on this page --
2009-05-01 15:54 [JGIT PATCH v3] Replace inefficient new String(String) constructor to silence FindBugs Shawn O. Pearce
2009-05-04 21:23 ` Sohn, Matthias
This is a public inbox, see mirroring instructions
for how to clone and mirror all data and code used for this inbox;
as well as URLs for NNTP newsgroup(s).