代码审查以提高性能

时间:2018-12-19 06:20:43

标签: java performance hex

我有以下将十六进制字符串转换为字节数组的方法。尽管我可以使用Apache's-commons编解码器库中可用的方法来实现相同的目的,DatatypeConverter.parseHexBinary()和使用BigInteger。但是我需要的只是性能。是否有办法以某种方式进一步优化下面的代码?

public static byte[] decodeHexString(String hexString) {
    if (hexString.length() % 2 == 1) {
        hexString = "0" + hexString;
    }
    byte[] bytes = new byte[hexString.length() / 2];
    for (int i = 0; i < hexString.length(); i += 2) {
        bytes[i / 2] = hexToByte(hexString.substring(i, i + 2));
    }
    return bytes;
}
private static byte hexToByte(String hexString) {
    int firstDigit = Character.digit(hexString.charAt(0), 16);
    int secondDigit = Character.digit(hexString.charAt(1), 16);
    return (byte) ((firstDigit << 4) + secondDigit);
}

1 个答案:

答案 0 :(得分:1)

您最大的性能影响将是使用substring,并调用"0" +,我还将查看您是否也可以删除Character.digit的使用,最后,您也许可以不会每次都创建byte[]。进一步的优化是不要在循环开始时使用% 2或在循环中不使用i / 2

这样的事情。

// assume the input is valid.
static int digit(char ch) {
    return ch < 'A' ? ch - '0' : (ch & 31) + 10;
}

public static byte[] decodeHexString(String hexString) {
    byte[] bytes = new byte[(hexString.length() + 1) / 2];
    int i = 0, j = 0;
    if ((hexString.length() & 1) != 0) {
        bytes[i++] = (byte) digit(hexString.charAt(j++));
    }
    for (; j < hexString.length(); i++, j += 2)
        bytes[i] = (byte) ((digit(hexString.charAt(j)) << 4) + digit(hexString.charAt(j + 1)));

    return bytes;
}

要重用byte[],您必须传递一个数组以使用,避免创建它。

您可以通过使用反射来获取String中的基础数组来进一步优化此效果。