Функция в тексте программы на ассемблере

Есть функция у меня в программе, преобразующая массив byte в массив String

String[] _SS_usb_temp = byteArrayToHexString(arg1).split(" ");
.....
public String byteArrayToHexString(final byte[] bytes) {
   sb = new StringBuilder();
   for (byte b : bytes) {
       sb.append(String.format("%02x", b & 0xFF)).append(" ");
   }
   return sb.toString().toUpperCase();
}

В секунду обрабатывается около 1000 пакетов. Возможно ли эту функцию для ускорения обработки массивов написать на ассемблере и вставить этот код в тексте java?


Ответы (2 шт):

Автор решения: santavital

Как вариант можно создать Массив bytes2 длиной 2*Длинаbytes преобразовать bytes к bytes2

// byte[] to string
   String s = new String(bytes, StandardCharsets.UTF_8);

// Либо так:
  

// Java 8 - Base64 class, finally.
// byte[] to base64 encoded string
   String s = Base64.getEncoder().encodeToString(bytes);
→ Ссылка
Автор решения: m. vokhm

Написать часть кода на ассеблере -- это, честно говоря, довольно удивительное желание. В принципе, есть возможность использовать функции, написанные на других языках, в том числе на ассемблере, см. напр. википедию. Но во-первых, это не так просто, во всяком случае, для новичка, а во вторых, в большинстве случаев выигрыш будет не так уж велик. В вашем случае это было бы стрельбой из пушки по воробьям.

В смысле быстродействия можно гораздо проще получить ощутимый результат, просто поняв, что именно мы хотим сделать, и аккуратно написав именно это. В вашем случае производительность теряется на операциях с длинными строками -- преобразование StringBuilderа в длинную строку, перевод этой строки в верхний регистр, и последующая разбивка результата на подстроки.

Эта же самая работа, которую делает ваш фрагмент кода, может быть сделана намного быстрее:

import java.util.Random;

public class Ru_So_1248963_c {

  public static final int BYTE_COUNT = 2_500_000;
  private static final Random rand = new Random();

  public static void main(String[] args) {
    final byte[] bytes = getbytes();      // get them from wherever you need
    final String[] result = new String[bytes.length];

    for (int i = 0; i < 300_000; i++)     // warmup
      result[i] = hexByte1(bytes[i]);

    long time = System.nanoTime();        // Measure time
    for (int i = 0; i < BYTE_COUNT; i++)
      result[i] = hexByte1(bytes[i]);
    time = System.nanoTime() - time;

    System.out.format("v1: %,d байт конвертировано за %.3f мс,\n" +
                      "  скорость %,.3f байт в секунду\n\n",
                      BYTE_COUNT, time * 1e-6, BYTE_COUNT / (time * 1e-9));
  }

  /** Generates BYTE_COUNT random bytes */
  private static byte[] getbytes() {
    final byte[] bytes = new byte[BYTE_COUNT];
    rand.nextBytes(bytes);
    return bytes;
  }

  /** Hex digits */
  private static char[] HEX_CHARS = new char[] {
    '0', '1', '2', '3', '4', '5', '6', '7', '8', '9',
    'A', 'B', 'C', 'D', 'E', 'F',
  };

  /** Converts the given byte to a hex string */
  private static String hexByte1(byte b) {
    final char[] chars = new char[2];
    chars[0] = HEX_CHARS[b >>> 4 & 0xF];
    chars[1] = HEX_CHARS[b & 0xF];
    return new String(chars);
  }

}

Результат на моей машине (i5-4460 3.20GHz):

v1: 2 500 000 байт конвертировано за 222,610 мс,
  скорость 11 230 424,892 байт в секунду

Однако и ваш код работает намного быстрее, чем 1000 исходных байт в секунду -- где-то в районе сотен килобайт в секунду, если входной массив не слишком мал и не слишком велик (напр. от 10 000 до 10 000 000). Так что главная потеря быстродействия у вас где-то в другом месте, возможно там, где вы обрабатываете полученные строки.

Ну и скорей всего, как справедливо написали люди в комментариях, для решения вашей задачи можно обойтись и без возни с многочисленными строками. Много строк -- это всегда медленно, ведь каждая новая строка -- это выделение памяти под новый объект и потом последующая сборка мусора. К тому же, это крайне неэффективно по расходу памяти, на достаточно больших данных программа вообще может вылетать из-за переполнения кучи. Подумайте над тем, как обойтись без этого.

→ Ссылка