Author: ggregory Date: Thu Nov 22 15:39:15 2012 New Revision: 1412589 URL: http://svn.apache.org/viewvc?rev=1412589&view=rev Log: <action dev="ggregory" type="fix" issue="CODEC-163" due-to="leo141">ColognePhonetic encoder unneccessarily creates many char arrays on every loop run.</action>
Modified: commons/proper/codec/trunk/src/changes/changes.xml commons/proper/codec/trunk/src/main/java/org/apache/commons/codec/language/ColognePhonetic.java Modified: commons/proper/codec/trunk/src/changes/changes.xml URL: http://svn.apache.org/viewvc/commons/proper/codec/trunk/src/changes/changes.xml?rev=1412589&r1=1412588&r2=1412589&view=diff ============================================================================== --- commons/proper/codec/trunk/src/changes/changes.xml (original) +++ commons/proper/codec/trunk/src/changes/changes.xml Thu Nov 22 15:39:15 2012 @@ -48,6 +48,7 @@ The <action> type attribute can be add,u </release> --> <release version="1.8" date="TBA" description="Feature and fix release."> + <action dev="ggregory" type="fix" issue="CODEC-163" due-to="leo141">ColognePhonetic encoder unneccessarily creates many char arrays on every loop run.</action> <action dev="sebb" type="fix" issue="CODEC-160">Base64.encodeBase64URLSafeString doesn't add padding characters at the end.</action> </release> <release version="1.7" date="11 September 2012" description=" Modified: commons/proper/codec/trunk/src/main/java/org/apache/commons/codec/language/ColognePhonetic.java URL: http://svn.apache.org/viewvc/commons/proper/codec/trunk/src/main/java/org/apache/commons/codec/language/ColognePhonetic.java?rev=1412589&r1=1412588&r2=1412589&view=diff ============================================================================== --- commons/proper/codec/trunk/src/main/java/org/apache/commons/codec/language/ColognePhonetic.java (original) +++ commons/proper/codec/trunk/src/main/java/org/apache/commons/codec/language/ColognePhonetic.java Thu Nov 22 15:39:15 2012 @@ -179,6 +179,17 @@ import org.apache.commons.codec.StringEn */ public class ColognePhonetic implements StringEncoder { + // Predefined char arrays for better performance and less GC load + private static final char[] AEIJOUY = new char[] { 'A', 'E', 'I', 'J', 'O', 'U', 'Y' }; + private static final char[] SCZ = new char[] { 'S', 'C', 'Z' }; + private static final char[] WFPV = new char[] { 'W', 'F', 'P', 'V' }; + private static final char[] GKQ = new char[] { 'G', 'K', 'Q' }; + private static final char[] CKQ = new char[] { 'C', 'K', 'Q' }; + private static final char[] AHKLOQRUX = new char[] { 'A', 'H', 'K', 'L', 'O', 'Q', 'R', 'U', 'X' }; + private static final char[] SZ = new char[] { 'S', 'Z' }; + private static final char[] AHOUKQX = new char[] { 'A', 'H', 'O', 'U', 'K', 'Q', 'X' }; + private static final char[] TDX = new char[] { 'T', 'D', 'X' }; + /** * This class is not thread-safe; the field {@link #length} is mutable. * However, it is not shared between threads, as it is constructed on demand @@ -331,7 +342,7 @@ public class ColognePhonetic implements nextChar = '-'; } - if (arrayContains(new char[]{'A', 'E', 'I', 'J', 'O', 'U', 'Y'}, chr)) { + if (arrayContains(AEIJOUY, chr)) { code = '0'; } else if (chr == 'H' || chr < 'A' || chr > 'Z') { if (lastCode == '/') { @@ -340,13 +351,13 @@ public class ColognePhonetic implements code = '-'; } else if (chr == 'B' || (chr == 'P' && nextChar != 'H')) { code = '1'; - } else if ((chr == 'D' || chr == 'T') && !arrayContains(new char[]{'S', 'C', 'Z'}, nextChar)) { + } else if ((chr == 'D' || chr == 'T') && !arrayContains(SCZ, nextChar)) { code = '2'; - } else if (arrayContains(new char[]{'W', 'F', 'P', 'V'}, chr)) { + } else if (arrayContains(WFPV, chr)) { code = '3'; - } else if (arrayContains(new char[]{'G', 'K', 'Q'}, chr)) { + } else if (arrayContains(GKQ, chr)) { code = '4'; - } else if (chr == 'X' && !arrayContains(new char[]{'C', 'K', 'Q'}, lastChar)) { + } else if (chr == 'X' && !arrayContains(CKQ, lastChar)) { code = '4'; input.addLeft('S'); rightLength++; @@ -354,20 +365,19 @@ public class ColognePhonetic implements code = '8'; } else if (chr == 'C') { if (lastCode == '/') { - if (arrayContains(new char[]{'A', 'H', 'K', 'L', 'O', 'Q', 'R', 'U', 'X'}, nextChar)) { + if (arrayContains(AHKLOQRUX, nextChar)) { code = '4'; } else { code = '8'; } } else { - if (arrayContains(new char[]{'S', 'Z'}, lastChar) || - !arrayContains(new char[]{'A', 'H', 'O', 'U', 'K', 'Q', 'X'}, nextChar)) { + if (arrayContains(SZ, lastChar) || !arrayContains(AHOUKQX, nextChar)) { code = '8'; } else { code = '4'; } } - } else if (arrayContains(new char[]{'T', 'D', 'X'}, chr)) { + } else if (arrayContains(TDX, chr)) { code = '8'; } else if (chr == 'R') { code = '7';