Обзор кода для повышения производительности - PullRequest
0 голосов
/ 19 декабря 2018

У меня есть следующий метод, который преобразует шестнадцатеричную строку в байтовый массив.Хотя я могу добиться того же, используя методы, доступные в библиотеке Apache's-commons-codec, 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 голосов
/ 19 декабря 2018

Самым большим ударом по производительности будет использование 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.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...