Я работаю над программой, в которой у меня есть 2-байтовые массивы, и мне нужно вычислить разницу между ними. Например, если первый массив был {1, 2, 3}, а второй массив {2, 3, 4}, разница была бы 3.
Мой текущий метод для этого выглядит следующим образом:
public long calculateDifference(byte[] a, byte[] b) {
long difference = 0;
for(int i = 0; i < a.length; i++) {
difference += Math.abs(a[i] - b[i]);
}
return difference;
}
Однако программе необходимо будет обрабатывать байтовые массивы, содержащие до 5 000 000 элементов, поэтому использование текущего метода будет слишком медленным.
Поскольку у меня 16 потоков, в качестве опции я видел параллельные потоки. Но поскольку ByteStream отсутствует, использование операций сокращения и сбора было бы невозможным без распаковки и упаковки.
Другой вариант - использовать IntStream.range(0, byteArrayLength)
для создания параллельного потока и доступа к индексу с помощью int. , Однако для этого потребуется LongAdder или AtomicLong, оба из которых намного медленнее в моих тестах. (LongAdder, кажется, использует массив внутри, а затем суммирует его в конце)
Есть ли более эффективный способ добиться этого? Я не против добавления внешних зависимостей. Спасибо!