Request for Review : CR#6924259: Remove String.count/String.offset
David Schlosnagle
schlosna at gmail.com
Fri May 25 17:24:46 UTC 2012
>> On 24/05/2012 21:45, Mike Duigou wrote:
>>>
>>> Hello all;
>>>
>>> For a long time preparations and planing have been underway to remove the
>>> offset and count fields from java.lang.String. These two fields enable
>>> multiple String instances to share the same backing character buffer. Shared
>>> character buffers were an important optimization for old benchmarks but with
>>> current real world code and benchmarks it's actually better to not share
>>> backing buffers. Shared char array backing buffers only "win" with very
>>> heavy use of String.substring. The negatively impacted situations can
>>> include parsers and compilers however current testing shows that overall
>>> this change is beneficial.
>>>
>>> The current plan is to commit this change to jdk8 before build 40
>>> followed by jdk7u6. Removing offset/count is a complicated process because
>>> HotSpot has special case code for String that depends upon the two fields.
>>> Vladimir Kozlov has committed the required HotSpot changes already
>>> (http://hg.openjdk.java.net/jdk8/jdk8/hotspot/rev/8f972594effc).
>>>
>>> A patch of the changes to java.lang.String for JDK 8 are
>>> at<http://cr.openjdk.java.net/~mduigou/6924259/0/webrev/>. The changes for
>>> JDK 7 have only superficial differences (line offsets in the patch).
>>>
>>> Comments are welcome.
>>>
>>> Mike
Hi Mike,
I had a few quick comments that I didn't see exactly covered so far:
Should we extract original.value to a local to avoid multiple getfield
instructions in the non-empty case?
public String(String original) {
char[] originalValue = original.value;
this.value = (originalValue.length > 0)
? originalValue
: EMPTY_STRING_VALUE;
this.hash = original.hash;
}
Should the len be moved outside of the if condition in the following, and use
Arrays.copyOf (or value.clone()) to simplify the code and hopefully be
intrinsified?
public String(char value[]) {
final int len = value.length;
this.value = (len > 0)
? Arrays.copyOf(value, len);
: EMPTY_STRING_VALUE;
}
[1] http://markmail.org/message/ubg6s5dyvsidjipj
Thanks,
Dave
More information about the core-libs-dev
mailing list