Remove redundant calls of toString()

Louis Wasserman lowasser at google.com
Mon Apr 28 16:24:26 UTC 2014


-    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?



On Mon, Apr 28, 2014 at 8:43 AM, Claes Redestad
<claes.redestad at oracle.com>wrote:

> On 04/28/2014 08:57 AM, David Holmes wrote:
>
>> On 28/04/2014 1:05 PM, Otávio Gonçalves de Santana wrote:
>>
>>> In my opinion not, because Objects.requireNonNull is more readable than
>>> just string.toString. This way is more understandable which field is
>>> required and doesn't impact on performance.
>>>
>>
>> An invocation of requireNonNull is potentially more expensive than the
>> implicit null check that happens with foo.toString().
>>
>> David
>> -----
>>
>
> My thought was that these two would be inlined to the exact same thing, so
> I did a quick test to see what happens when you do foo.toString() versus
> Objects.requireNonNull(foo) on a set of randomly generated String[]'s with
> different amounts of null elements(0p: no null entries, 1p: 1% null entries
> etc):
>
> Benchmark                                     Mode Samples         Mean
> Mean error    Units
> s.m.ThrowAwayBenchmark.nullToString0p        thrpt 6   356653.044
> 3573.707   ops/ms
> s.m.ThrowAwayBenchmark.nullToString1p thrpt         6   353128.903
> 2764.102   ops/ms
> s.m.ThrowAwayBenchmark.nullToString10p thrpt         6   297956.571
> 9580.251   ops/ms
> s.m.ThrowAwayBenchmark.nullToString50p thrpt         6 158172.036
> 1893.096   ops/ms
> s.m.ThrowAwayBenchmark.nullToString100p thrpt         6    18194.614
>  472.091   ops/ms
> s.m.ThrowAwayBenchmark.requireNonNull0p thrpt         6   357855.126
> 2979.090   ops/ms
> s.m.ThrowAwayBenchmark.requireNonNull1p thrpt         6    67601.134
> 7004.689   ops/ms
> s.m.ThrowAwayBenchmark.requireNonNull10p thrpt         6     8150.595
>  538.970   ops/ms
> s.m.ThrowAwayBenchmark.requireNonNull50p thrpt         6     1604.919
>  220.903   ops/ms
> s.m.ThrowAwayBenchmark.requireNonNull100p thrpt         6      820.626
>     60.752   ops/ms
>
> Yikes! As long as the value is never null they're inlined nicely and
> neither have the upper hand performance-wise, but as soon as you get some
> null values, Objects.requireNonNull degenerates much faster than its
> foo.toString counterpart. I think this is a JIT issue - optimizing
> exception-paths might not be the highest priority, but
> Objects.requireNonNull is used pretty extensively in the JDK and my
> expectation would be that it shouldn't degrade performance when things
> actually are null now and then.
>
> /Claes
>



-- 
Louis Wasserman



More information about the core-libs-dev mailing list