Re: Optimizing Java method
Benjamin White wrote:
The routine below is supposed to convert a String containing decimal
digits to a IBM mainframe Z/series packed decimal number. It seems to
consume a lot of CPU time. Background about this is at
http://benjaminjwhite.name/zdecimal/doc/index.html Is there a faster
way to code this?
To sum up things:
private static WeakHashMap cache = new WeakHashMap();
public static byte[] stringToPack(String str) throws DataException {
WeakReference wr = (WeakReference) cache.get(str);
if (wr != null && wr.get() != null){
return (byte[]) wr.get().clone();
}
byte[] res = new byte[16];
int shift = 4;
int currIndex = res.length; // decreased in loop
for (int i = str.length() - 1; i >= 0; i--){
char elem = str.charAt(i);
if (elem >= '0' && elem <= '9'){
if (shift != 0){
currIndex--;
}
res[currIndex] |= (byte) ((elem - '0') << shift);
shift ^= 4;
}
else{
switch(elem){
case ',':
case ' ':
case '.':
case '$':
case '+':{
break;
}
case '0':{
res[res.length - 1] &= 0xf0;
res[res.length - 1] |= 0x0d;
break;
}
default:{
throw new DataException("Invalid decimal digit: " + ch1 + " in string '" + str + "'");
}
}
}
}
cache.put(str, new WeakReference(res));
return res;
}
Not tested, just typed.
Regards, Lothar
--
Lothar Kimmeringer E-Mail: spamfang@kimmeringer.de
PGP-encrypted mails preferred (Key-ID: 0x8BC3CD81)
Always remember: The answer is forty-two, there can only be wrong
questions!