Can access by local method variables be faster then access by member variables ?

Ulf Zibis Ulf.Zibis at gmx.de
Fri Aug 15 15:02:25 PDT 2008


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