Can access by local method variables be faster then access by member variables ?
Xiaobin Lu
Xiaobin.Lu at Sun.COM
Fri Aug 15 15:26:55 PDT 2008
I suspect that adding two members to the object would increase the
object size which might affect the efficiency of object allocation. Have
you had a chance to look at the generated code, it might be possible
that the method itself is inlined so the pop/push operations have been
completely eliminated?
-Xiaobin
Ulf Zibis wrote:
> Hi experts,
>
> to avoid stack push + pop of src, dst I have refactored my code in
> moving the local method variables (sp, ...) to member variables
> (srcPos, ...).
>
> After this I have experienced that my code was little slower.
>
> For full source code see:
> https://java-nio-charset-enhanced.dev.java.net/source/browse/java-nio-charset-enhanced/trunk/src/sun/nio/cs/SingleByteEncoder.java?rev=291&view=markup
>
> https://java-nio-charset-enhanced.dev.java.net/source/browse/java-nio-charset-enhanced/trunk/src/sun/nio/cs/SingleByteEncoder.java?rev=302&view=markup
>
>
> ======================================== revisions 291
> ========================================
>
> private CoderResult encodeArraysLoop(CharBuffer src, ByteBuffer dst) {
> char[] sa = src.array();
> int sp = src.arrayOffset() + src.position();
> int sl = src.arrayOffset() + src.limit();
> assert (sp <= sl);
> byte[] da = dst.array();
> int dp = dst.arrayOffset() + dst.position();
> int dl = dst.arrayOffset() + dst.limit();
> assert (dp <= dl);
> try {
> for (; sp < sl; sp++) {
> current = sa[sp];
> byte b = encodeSingle();
> if (dp >= dl)
> return CoderResult.OVERFLOW;
> da[dp++] = b;
> }
> return CoderResult.UNDERFLOW;
> } catch (UnmappableCharacterException e) {
> if (Surrogate.isLow(current) || current >= '\uFFFE')
> return CODERRESULT_MALFORMED;
> if (Surrogate.isHigh(current))
> try {
> if (sp+1 >= sl)
> return CoderResult.UNDERFLOW;
> encodeSurrogate(sa[sp+1]);
> } catch (UnmappableCharacterException e2) {
> return CODERRESULT_UNMAPPABLE2;
> } catch (MalformedInputException e2) {
> return CODERRESULT_MALFORMED2;
> }
> return CODERRESULT_UNMAPPABLE;
> } finally {
> src.position(sp - src.arrayOffset());
> dst.position(dp - dst.arrayOffset());
> }
> }
>
> ======================================== revisions 302
> ========================================
>
> private CoderResult encodeArraysLoop() throws RuntimeException,
> UnmappableCharacterException {
> for (; srcPos < srcLimit; srcPos++) {
> current = srcArray[srcPos];
> byte b = encodeSingle();
> if (dstPos < dstLimit)
> dstArray[dstPos++] = b;
> else
> return CoderResult.OVERFLOW;
> }
> return CoderResult.UNDERFLOW;
> }
>
> ===============================================================================================
>
>
>
> Thanks for your explanations,
>
> Ulf
>
>
>
>
More information about the hotspot-dev
mailing list