Remove redundant calls of toString()

Remi Forax forax at univ-mlv.fr
Tue Apr 29 07:45:16 UTC 2014


On 04/29/2014 12:43 AM, Jim Graham wrote:
> We refer to these strings as constants in many places.  If you have:
>
> class Foo {
>     static final String bar = "<really long string>";
> }
>
> class Blah {
>     // uses Foo.bar
> }
>
> Then Blah will incorporate that string by content, not by reference.  
> I don't know why this is done this way, but Strings are special in 
> that static final versions of them are included by value just the way 
> that static final primitive types are.  As a result, we had huge 
> duplications of these strings all over the place.

yes and no.
You have no duplication at runtime because the VM use a common 
dictionary for all constant strings (it's required by the Java spec) but 
you have duplication of the string at bytecode level. Basically the 
class file is bigger because the compiler duplicate the String as you 
said by content but you have no duplication at runtime because the VM 
dedup the constant strings using a dictionary.

> But, this only happens when you initialize it to a constant "..." 
> string.  If it is the result of a method call (or probably a 
> calculation), then it ends up being treated like any static final 
> object and is included by reference.  Thus, appending .toString(); to 
> the "..." constant foils the "include by value" processing in the 
> compiler...

yes, "foo" is a constant for the compiler but "foo".toString() is not.

so by calling toString on a big String you save .class space.

Also note that this is not an issue with Android because the Android 
class format (DEX) use one constant pool for several classes and not one 
constant pool by .class.

>
>                 ...jim

cheers,
Rémi

>
> On 4/28/14 2:47 PM, Phil Race wrote:
>> I am quite sure that you are right that these were deliberate so
>> I am adding Jim who was the author of all of the 2d ones to explain the
>> intent.
>>
>> BTW Otávio, changes in 2D code like this should not slip by on the
>> core-libs list.
>> It ought to go to 2d-dev.
>>
>> -phil.
>>
>> On 4/28/2014 9:24 AM, Louis Wasserman wrote:
>>> -    public final static String methodSignature =
>>> "DrawGlyphList(...)".toString();
>>> +    public final static String methodSignature = "DrawGlyphList(...)";
>>>
>>> I conjecture that this, and other similar examples, are to avoid
>>> having the
>>> string be a compile-time constant that can be inlined into other files.
>>>   Has anyone checked that there aren't any issues arising from
>>> changing this?
>>>
>>>
>>>
>>>
>>>
>>
>> n 4/27/2014 6:15 AM, Otávio Gonçalves de Santana wrote:
>>> There is an issue that was opened to remove redundant calls of 
>>> toString()
>>> on String objects. [1]
>>> I went deep on all JVM sources and I found all, 32 changes.
>>>
>>>
>>> [1]https://bugs.openjdk.java.net/browse/JDK-8015470
>>>
>>> diff -r e323c74edabd
>>> src/share/classes/javax/swing/text/html/FormView.java
>>> --- a/src/share/classes/javax/swing/text/html/FormView.java Wed Apr 23
>>> 11:35:40 2014 -0700
>>> +++ b/src/share/classes/javax/swing/text/html/FormView.java Sat Apr 26
>>> 01:40:27 2014 -0300
>>> @@ -478,7 +478,7 @@
>>>                                           base.getPort(), 
>>> base.getFile())
>>>                   : new URL(base, action);
>>>               if (!isPostMethod) {
>>> -                String query = data.toString();
>>> +                String query = data;
>>>                   actionURL = new URL(actionURL + "?" + query);
>>>               }
>>>           } catch (MalformedURLException e) {
>>> diff -r e323c74edabd src/share/classes/sun/java2d/loops/Blit.java
>>> --- a/src/share/classes/sun/java2d/loops/Blit.java Wed Apr 23 11:35:40
>>> 2014
>>> -0700
>>> +++ b/src/share/classes/sun/java2d/loops/Blit.java Sat Apr 26 01:40:27
>>> 2014
>>> -0300
>>> @@ -50,7 +50,7 @@
>>>
>>>   public class Blit extends GraphicsPrimitive
>>>   {
>>> -    public static final String methodSignature = 
>>> "Blit(...)".toString();
>>> +    public static final String methodSignature = "Blit(...)";
>>>
>>>       public static final int primTypeID = makePrimTypeID();
>>>
>>> diff -r e323c74edabd src/share/classes/sun/java2d/loops/BlitBg.java
>>> --- a/src/share/classes/sun/java2d/loops/BlitBg.java Wed Apr 23 
>>> 11:35:40
>>> 2014 -0700
>>> +++ b/src/share/classes/sun/java2d/loops/BlitBg.java Sat Apr 26 
>>> 01:40:27
>>> 2014 -0300
>>> @@ -54,7 +54,7 @@
>>>    */
>>>   public class BlitBg extends GraphicsPrimitive
>>>   {
>>> -    public static final String methodSignature =
>>> "BlitBg(...)".toString();
>>> +    public static final String methodSignature = "BlitBg(...)";
>>>
>>>       public static final int primTypeID = makePrimTypeID();
>>>
>>> diff -r e323c74edabd
>>> src/share/classes/sun/java2d/loops/DrawGlyphList.java
>>> --- a/src/share/classes/sun/java2d/loops/DrawGlyphList.java Wed Apr 23
>>> 11:35:40 2014 -0700
>>> +++ b/src/share/classes/sun/java2d/loops/DrawGlyphList.java Sat Apr 26
>>> 01:40:27 2014 -0300
>>> @@ -39,7 +39,7 @@
>>>    */
>>>   public class DrawGlyphList extends GraphicsPrimitive {
>>>
>>> -    public final static String methodSignature =
>>> "DrawGlyphList(...)".toString();
>>> +    public final static String methodSignature = "DrawGlyphList(...)";
>>>
>>>       public final static int primTypeID = makePrimTypeID();
>>>
>>> diff -r e323c74edabd
>>> src/share/classes/sun/java2d/loops/DrawGlyphListAA.java
>>> --- a/src/share/classes/sun/java2d/loops/DrawGlyphListAA.java Wed 
>>> Apr 23
>>> 11:35:40 2014 -0700
>>> +++ b/src/share/classes/sun/java2d/loops/DrawGlyphListAA.java Sat 
>>> Apr 26
>>> 01:40:27 2014 -0300
>>> @@ -39,7 +39,7 @@
>>>    */
>>>   public class DrawGlyphListAA extends GraphicsPrimitive {
>>>
>>> -    public final static String methodSignature =
>>> "DrawGlyphListAA(...)".toString();
>>> +    public final static String methodSignature = 
>>> "DrawGlyphListAA(...)";
>>>
>>>       public final static int primTypeID = makePrimTypeID();
>>>
>>> diff -r e323c74edabd
>>> src/share/classes/sun/java2d/loops/DrawGlyphListLCD.java
>>> --- a/src/share/classes/sun/java2d/loops/DrawGlyphListLCD.java Wed 
>>> Apr 23
>>> 11:35:40 2014 -0700
>>> +++ b/src/share/classes/sun/java2d/loops/DrawGlyphListLCD.java Sat 
>>> Apr 26
>>> 01:40:27 2014 -0300
>>> @@ -40,7 +40,7 @@
>>>   public class DrawGlyphListLCD extends GraphicsPrimitive {
>>>
>>>       public final static String
>>> -        methodSignature = "DrawGlyphListLCD(...)".toString();
>>> +        methodSignature = "DrawGlyphListLCD(...)";
>>>
>>>       public final static int primTypeID = makePrimTypeID();
>>>
>>> diff -r e323c74edabd src/share/classes/sun/java2d/loops/DrawLine.java
>>> --- a/src/share/classes/sun/java2d/loops/DrawLine.java Wed Apr 23
>>> 11:35:40
>>> 2014 -0700
>>> +++ b/src/share/classes/sun/java2d/loops/DrawLine.java Sat Apr 26
>>> 01:40:27
>>> 2014 -0300
>>> @@ -44,7 +44,7 @@
>>>    */
>>>   public class DrawLine extends GraphicsPrimitive
>>>   {
>>> -    public final static String methodSignature =
>>> "DrawLine(...)".toString();
>>> +    public final static String methodSignature = "DrawLine(...)";
>>>
>>>       public final static int primTypeID = makePrimTypeID();
>>>
>>> diff -r e323c74edabd
>>> src/share/classes/sun/java2d/loops/DrawParallelogram.java
>>> --- a/src/share/classes/sun/java2d/loops/DrawParallelogram.java Wed
>>> Apr 23
>>> 11:35:40 2014 -0700
>>> +++ b/src/share/classes/sun/java2d/loops/DrawParallelogram.java Sat
>>> Apr 26
>>> 01:40:27 2014 -0300
>>> @@ -43,7 +43,7 @@
>>>   public class DrawParallelogram extends GraphicsPrimitive
>>>   {
>>>       public final static String methodSignature =
>>> -        "DrawParallelogram(...)".toString();
>>> +        "DrawParallelogram(...)";
>>>
>>>       public final static int primTypeID = makePrimTypeID();
>>>
>>> diff -r e323c74edabd src/share/classes/sun/java2d/loops/DrawPath.java
>>> --- a/src/share/classes/sun/java2d/loops/DrawPath.java Wed Apr 23
>>> 11:35:40
>>> 2014 -0700
>>> +++ b/src/share/classes/sun/java2d/loops/DrawPath.java Sat Apr 26
>>> 01:40:27
>>> 2014 -0300
>>> @@ -39,7 +39,7 @@
>>>   public class DrawPath extends GraphicsPrimitive {
>>>
>>>       public final static String methodSignature =
>>> -        "DrawPath(...)".toString();
>>> +        "DrawPath(...)";
>>>
>>>       public final static int primTypeID = makePrimTypeID();
>>>
>>> diff -r e323c74edabd 
>>> src/share/classes/sun/java2d/loops/DrawPolygons.java
>>> --- a/src/share/classes/sun/java2d/loops/DrawPolygons.java Wed Apr 23
>>> 11:35:40 2014 -0700
>>> +++ b/src/share/classes/sun/java2d/loops/DrawPolygons.java Sat Apr 26
>>> 01:40:27
>>> 2014 -0300
>>> @@ -41,7 +41,7 @@
>>>    */
>>>   public class DrawPolygons extends GraphicsPrimitive
>>>   {
>>> -    public final static String methodSignature =
>>> "DrawPolygons(...)".toString();
>>> +    public final static String methodSignature = "DrawPolygons(...)";
>>>
>>>       public final static int primTypeID = makePrimTypeID();
>>>
>>> diff -r e323c74edabd src/share/classes/sun/java2d/loops/DrawRect.java
>>> --- a/src/share/classes/sun/java2d/loops/DrawRect.java Wed Apr 23
>>> 11:35:40
>>> 2014 -0700
>>> +++ b/src/share/classes/sun/java2d/loops/DrawRect.java Sat Apr 26
>>> 01:40:27
>>> 2014 -0300
>>> @@ -44,7 +44,7 @@
>>>    */
>>>   public class DrawRect extends GraphicsPrimitive
>>>   {
>>> -    public final static String methodSignature =
>>> "DrawRect(...)".toString();
>>> +    public final static String methodSignature = "DrawRect(...)";
>>>
>>>       public final static int primTypeID = makePrimTypeID();
>>>
>>> diff -r e323c74edabd
>>> src/share/classes/sun/java2d/loops/FillParallelogram.java
>>> --- a/src/share/classes/sun/java2d/loops/FillParallelogram.java Wed
>>> Apr 23
>>> 11:35:40 2014 -0700
>>> +++ b/src/share/classes/sun/java2d/loops/FillParallelogram.java Sat
>>> Apr 26
>>> 01:40:27 2014 -0300
>>> @@ -41,7 +41,7 @@
>>>   public class FillParallelogram extends GraphicsPrimitive
>>>   {
>>>       public final static String methodSignature =
>>> -        "FillParallelogram(...)".toString();
>>> +        "FillParallelogram(...)";
>>>
>>>       public final static int primTypeID = makePrimTypeID();
>>>
>>> diff -r e323c74edabd src/share/classes/sun/java2d/loops/FillPath.java
>>> --- a/src/share/classes/sun/java2d/loops/FillPath.java Wed Apr 23
>>> 11:35:40
>>> 2014 -0700
>>> +++ b/src/share/classes/sun/java2d/loops/FillPath.java Sat Apr 26
>>> 01:40:27
>>> 2014 -0300
>>> @@ -39,7 +39,7 @@
>>>   public class FillPath extends GraphicsPrimitive {
>>>
>>>       public final static String methodSignature =
>>> -        "FillPath(...)".toString();
>>> +        "FillPath(...)";
>>>
>>>       public final static int primTypeID = makePrimTypeID();
>>>
>>> diff -r e323c74edabd src/share/classes/sun/java2d/loops/FillRect.java
>>> --- a/src/share/classes/sun/java2d/loops/FillRect.java Wed Apr 23
>>> 11:35:40
>>> 2014 -0700
>>> +++ b/src/share/classes/sun/java2d/loops/FillRect.java Sat Apr 26
>>> 01:40:27
>>> 2014 -0300
>>> @@ -44,7 +44,7 @@
>>>    */
>>>   public class FillRect extends GraphicsPrimitive
>>>   {
>>> -    public final static String methodSignature =
>>> "FillRect(...)".toString();
>>> +    public final static String methodSignature = "FillRect(...)";
>>>
>>>       public final static int primTypeID = makePrimTypeID();
>>>
>>> diff -r e323c74edabd src/share/classes/sun/java2d/loops/FillSpans.java
>>> --- a/src/share/classes/sun/java2d/loops/FillSpans.java Wed Apr 23
>>> 11:35:40
>>> 2014 -0700
>>> +++ b/src/share/classes/sun/java2d/loops/FillSpans.java Sat Apr 26
>>> 01:40:27
>>> 2014 -0300
>>> @@ -45,7 +45,7 @@
>>>    */
>>>   public class FillSpans extends GraphicsPrimitive
>>>   {
>>> -    public final static String methodSignature =
>>> "FillSpans(...)".toString();
>>> +    public final static String methodSignature = "FillSpans(...)";
>>>
>>>       public final static int primTypeID = makePrimTypeID();
>>>
>>> diff -r e323c74edabd src/share/classes/sun/java2d/loops/MaskBlit.java
>>> --- a/src/share/classes/sun/java2d/loops/MaskBlit.java Wed Apr 23
>>> 11:35:40
>>> 2014 -0700
>>> +++ b/src/share/classes/sun/java2d/loops/MaskBlit.java Sat Apr 26
>>> 01:40:27
>>> 2014 -0300
>>> @@ -48,7 +48,7 @@
>>>
>>>   public class MaskBlit extends GraphicsPrimitive
>>>   {
>>> -    public static final String methodSignature =
>>> "MaskBlit(...)".toString();
>>> +    public static final String methodSignature = "MaskBlit(...)";
>>>
>>>       public static final int primTypeID = makePrimTypeID();
>>>
>>> diff -r e323c74edabd src/share/classes/sun/java2d/loops/MaskFill.java
>>> --- a/src/share/classes/sun/java2d/loops/MaskFill.java Wed Apr 23
>>> 11:35:40
>>> 2014 -0700
>>> +++ b/src/share/classes/sun/java2d/loops/MaskFill.java Sat Apr 26
>>> 01:40:27
>>> 2014 -0300
>>> @@ -50,11 +50,11 @@
>>>    */
>>>   public class MaskFill extends GraphicsPrimitive
>>>   {
>>> -    public static final String methodSignature =
>>> "MaskFill(...)".toString();
>>> +    public static final String methodSignature = "MaskFill(...)";
>>>       public static final String fillPgramSignature =
>>> -        "FillAAPgram(...)".toString();
>>> +        "FillAAPgram(...)";
>>>       public static final String drawPgramSignature =
>>> -        "DrawAAPgram(...)".toString();
>>> +        "DrawAAPgram(...)";
>>>
>>>       public static final int primTypeID = makePrimTypeID();
>>>
>>> diff -r e323c74edabd src/share/classes/sun/java2d/loops/ScaledBlit.java
>>> --- a/src/share/classes/sun/java2d/loops/ScaledBlit.java Wed Apr 23
>>> 11:35:40 2014 -0700
>>> +++ b/src/share/classes/sun/java2d/loops/ScaledBlit.java Sat Apr 26
>>> 01:40:27
>>> 2014 -0300
>>> @@ -45,7 +45,7 @@
>>>
>>>   public class ScaledBlit extends GraphicsPrimitive
>>>   {
>>> -    public static final String methodSignature =
>>> "ScaledBlit(...)".toString();
>>> +    public static final String methodSignature = "ScaledBlit(...)";
>>>
>>>       public static final int primTypeID = makePrimTypeID();
>>>
>>> diff -r e323c74edabd
>>> src/share/classes/sun/java2d/loops/TransformBlit.java
>>> --- a/src/share/classes/sun/java2d/loops/TransformBlit.java Wed Apr 23
>>> 11:35:40 2014 -0700
>>> +++ b/src/share/classes/sun/java2d/loops/TransformBlit.java Sat Apr 26
>>> 01:40:27 2014 -0300
>>> @@ -47,7 +47,7 @@
>>>   public class TransformBlit extends GraphicsPrimitive
>>>   {
>>>       public static final String methodSignature =
>>> -        "TransformBlit(...)".toString();
>>> +        "TransformBlit(...)";
>>>
>>>       public static final int primTypeID = makePrimTypeID();
>>>
>>> diff -r e323c74edabd
>>> src/share/classes/sun/java2d/loops/TransformHelper.java
>>> --- a/src/share/classes/sun/java2d/loops/TransformHelper.java Wed 
>>> Apr 23
>>> 11:35:40 2014 -0700
>>> +++ b/src/share/classes/sun/java2d/loops/TransformHelper.java Sat 
>>> Apr 26
>>> 01:40:27 2014 -0300
>>> @@ -46,7 +46,7 @@
>>>   public class TransformHelper extends GraphicsPrimitive
>>>   {
>>>       public static final String methodSignature =
>>> -        "TransformHelper(...)".toString();
>>> +        "TransformHelper(...)";
>>>
>>>       public static final int primTypeID = makePrimTypeID();
>>>
>>>
>>




More information about the core-libs-dev mailing list