Улучшение производительности метода Java

1

Лучшее решение?

   public String toString(byte[] array) {
        if (array == null)
            return "null";

            StringBuilder  sb = new StringBuilder(256).append('[');
            for (int j = 0; j < array.length; ++j) {
                sb.append(array[j]);
                if (j != array.length - 1)
                sb.append(", ");
            }
        return sb.append(']').toString();
    }

Лучшее решение? Если возможно, более быстрое решение для выполнения этого метода

Теги:
performance

2 ответа

4

Arrays.toString() возвращает представление String указанного массива. Возможно, этого должно быть достаточно:

String s1 = Arrays.toString(byte);
  • 1
    Ну, я бы не сказал, что это быстрее ... Я бы сказал, что это проще. :-)
  • 2
    когда я пытался выполнить оба, это дало мне значительное преимущество в производительности.
Показать ещё 3 комментария
0

Следующая строка:

sb.append(array[j]);

является своего рода дорогостоящим, поскольку он включает преобразование int в представление символа и в то же время отслеживание рабочего буфера и т.д.

Альтернатива:

Если вы можете жить с результатом вроде этого:

[-123, 123, 002, 000,-022, 127]

вместо

[-123, 123, 2, 0, -22, 127]

Затем метод ниже в 2 - 3 раза быстрее на моей машине:

    public String toString(byte[] array) {
        final char DIGITS[] = {'0', '1', '2', '3', '4', '5', '6', '7', '8', '9'};
        if (array == null) {
            return "null";
        }

        char[] res = new char[(array.length * 5) + 1];

        int abs;
        int pos = 0;
        res[pos++] = '[';
        for (int i = 0; i < array.length; i++) {
            if (array[i] < 0) {
                abs = - array[i];
                res[pos++] = '-';
            } else {
                abs = array[i];
                res[pos++] = ' ';
            }
            res[pos++] = (abs >= 100 ? '1' : '0');
            int rest = (abs % 100); 
            res[pos++] = DIGITS[rest / 10]; 
            res[pos++] = DIGITS[rest % 10];
            res[pos++] = ',';
        }
        res[res.length - 1] = ']';

        return new String(res);
    }
  • 0
    Нет необходимости добавлять 0
  • 0
    Вы не объяснили, почему вы хотите это в String так быстро, поэтому я предположил, что все в порядке. Я понимаю, как кодировать его без 0. Однако это усложняет код и делает его медленнее. Например, код предварительно. выделяет массив, поэтому ему не нужно проверять границы, не нужно расширять его и т. д. Если вы не хотите использовать числа переменной длины в выходных данных, это усложняет логику, что делает его медленнее. Он обрезает эти углы, что делает вышеописанную реализацию быстрее, чем ваша.
Показать ещё 4 комментария

Ещё вопросы

Сообщество Overcoder
Наверх
Меню