Отформатируйте MAC-адрес в Android / Java без создания ненужного мусора

Я работаю над Android-приложением, которое должно обрабатывать тысячи пакетов в секунду при извлечении и форматировании MAC-адреса каждого фрейма. Проблема в том, что сборщик мусора работает десяток раз в секунду и останавливает мое приложение, что, в свою очередь, заставляет меня пропускать пакеты. Я избегал создания новых объектов, насколько это возможно (я думаю).

Я использовал трекер распределения в DDMS и определил, что 99% очищаемого мусора исходит из следующего метода. Вот код, который я использую:

void parseMac() { hex_sb.setLength(0); for (hex_counter = 0; hex_counter < 6; hex_counter++) { hex_sb.append(String.format("%02X", parser_packet_bytes[parser_skip + hex_counter])); if (!(hex_counter == 5)) { hex_sb.append(":"); } } formatted_mac = hex_sb.toString(); } 

Hex_sb – это StringBuilder, который используется повторно. Hex_counter – это количество байтов в MAC-адресе (байты поступают из parser_packet_bytes, byte []). Если это не последний байт MAC, добавьте «:» для правильного форматирования. Formatted_mac – это строка класса, которая хранит отформатированный MAC. Согласно трекеру выделения, единственной проблемой является строка, использующая String.format.

Мой вопрос к экспертам StackOverflow: как я могу переписать вышеупомянутый метод, чтобы создать меньше (предпочтительнее нет) мусора?

Вместо использования String.format() , что довольно дорого, просто вручную добавьте куски. К сожалению, цифры и буквы не смежны в ASCII / UTF-8, так вот как бы я справился с этим:

 static final char HEX_DIGITS[] = "01234567890abcdef".toCharArray(); ... hex_sb.append(HEX_DIGITS[thisByte >> 4]).append(HEX_DIGITS[thisByte & 0xf]); 

Поскольку это MAC-адрес (известная длина) и получает много имен, я бы, вероятно, развернул все это, включая добавление двоеточия / периода (который должен быть char , а не String ). Если это действительно критически важно, управляйте своим собственным char[] и передайте его в String#new(char[]) . Вы можете избежать повторной установки разделителей таким образом.

Каждому новому MAC потребуется новый String, вы не можете его помочь, поскольку String неизменен. Что касается манипуляций с StringBuilder, он не создает никакого мусора, поскольку StringBuilder будет повторно использовать тот же массив символов в setLength (0) и append, он изменит только текущую позицию. Единственное, что могло бы помочь, это работать с StringBuilder напрямую, не преобразовывая его в String, если только это возможно.