On 23/09/2014 15:13, Christopher Schultz wrote:
> Mark,
>
> On 9/23/14 9:15 AM, Mark Thomas wrote:
>> On 23/09/2014 14:09, [email protected] wrote:
>>> Author: schultz
>>> Date: Tue Sep 23 13:09:42 2014
>>> New Revision: 1627000
>>>
>>> URL: http://svn.apache.org/r1627000
>>> Log:
>>> Micro optimization.
>>
>> What is the performance benefit of this change?
>
> See below.
>
>>> Modified:
>>> tomcat/trunk/java/org/apache/tomcat/util/buf/HexUtils.java
>>>
>>> Modified: tomcat/trunk/java/org/apache/tomcat/util/buf/HexUtils.java
>>> URL:
>>> http://svn.apache.org/viewvc/tomcat/trunk/java/org/apache/tomcat/util/buf/HexUtils.java?rev=1627000&r1=1626999&r2=1627000&view=diff
>>> ==============================================================================
>>> --- tomcat/trunk/java/org/apache/tomcat/util/buf/HexUtils.java (original)
>>> +++ tomcat/trunk/java/org/apache/tomcat/util/buf/HexUtils.java Tue Sep 23
>>> 13:09:42 2014
>>> @@ -75,10 +75,12 @@ public final class HexUtils {
>>> if (null == bytes) {
>>> return null;
>>> }
>>> + final char[] hex = HexUtils.hex;
>>> + final int length = bytes.length;
>>>
>>> - StringBuilder sb = new StringBuilder(bytes.length << 1);
>>> + StringBuilder sb = new StringBuilder(length << 1);
>>>
>>> - for(int i = 0; i < bytes.length; ++i) {
>>> + for(int i = 0; i < length; ++i) {
>
> bytes.length requires "aload" and "arraylength" opcodes while using a
> local variable uses a single "aload" operation. Since I'm going to use
> "length" instead of bytes.length, I may as well use it to construct the
> StringBuilder object.
>
> Compared to sb.append() this optimization is likely to be lost in the
> noise, but it is still a slight improvement.
-1.
This changes makes the code harder to read and no evidence has been
presented that it will make any noticeable improvement. The chances are
that the compiler will in-line this any way.
Mark
>
>>> sb.append(hex[(bytes[i] & 0xf0) >> 4])
>>> .append(hex[(bytes[i] & 0x0f)])
>>> ;
>>> @@ -94,8 +96,9 @@ public final class HexUtils {
>>> }
>>>
>>> char[] inputChars = input.toCharArray();
>>> - byte[] result = new byte[input.length() >> 1];
>>> - for (int i = 0; i < result.length; i++) {
>>> + final int length = input.length() >> 1;
>>> + byte[] result = new byte[length];
>>> + for (int i = 0; i < length; i++) {
>
> Same here: fewer opcodes per loop.
>
>>> result[i] = (byte) ((getDec(inputChars[2*i]) << 4) +
>>> getDec(inputChars[2*i + 1]));
>>> }
>>> return result;
>
> -chris
>
---------------------------------------------------------------------
To unsubscribe, e-mail: [email protected]
For additional commands, e-mail: [email protected]