В настоящее время я работаю над некоторым сетевым кодом (это мой первый сервер) и задал быстрый вопрос об оптимизации конкретной функции, которая записывает значения в виде битов, а затем упаковывает их в байты. Причиной оптимизации этой функции является то, что она используется тысячами раз для каждого сервера, чтобы упаковывать данные для отправки нескольким клиентам.
Пример может служить лучше, чтобы объяснить, что пытается выполнить функция:
Значение 3 может быть представлено двумя битами.
В двоичном формате это будет выглядеть как 00000011
. Функция превратит это двоичное значение в 11000000
. Когда функция будет вызвана снова, она будет знать, что она начинается с 3-го наиболее значимого бита (3-е из правого/десятичного числа 32) и записывает не более 6 бит в текущий байт. Если тогда были оставленные биты для записи, он начинался бы с нового байта.
Целью этого является сохранение пространства, если у вас есть несколько значений, которые могут быть меньше байта.
Моя текущая функция выглядит так:
private ByteBuffer out = ByteBuffer.allocate(1024);
private int bitIndex = 0;
/*
* Value: The value to write
* Amount: The number of bits to represent the value in.
*/
public OutputBuffer writeBits(long value, int amount) {
if (bitIndex != 0) {
int remainingBits = 8 - bitIndex;
int bytePos = out.position() - 1;
byte current = out.get(bytePos);
int shiftAmount = amount - remainingBits;
int bitsWritten = amount < remainingBits ? amount : remainingBits;
int clearShiftAmount = 8 - bitsWritten + 56;
byte b;
if (shiftAmount < 0) {
b = (byte) (current | (value << remainingBits - amount));
} else {
//deal with negative values
long temp = (value >> shiftAmount);
temp = (temp << clearShiftAmount);
temp = (byte) (temp >>> clearShiftAmount);
b = (byte) (current | temp);
}
out.put(bytePos,b);
bitIndex = (bitIndex + bitsWritten) % 8;
amount -= bitsWritten;
}
if (amount <= 0) {
return this;
}
bitIndex = amount & 7;
int newAmount = amount - bitIndex;
//newValue should not equal 2047
for (int i = 0; i != newAmount; i += 8) {
writeByte((byte) ((value >> i)), false);
}
if (bitIndex > 0)
writeByte((byte) (value << (8 - bitIndex)), false);
return this;
}
Поскольку я новичок в этом, я думаю, что могут быть более эффективные способы, возможно, используя бит-маскирование или какую-то таблицу поиска? Любые идеи или рулевое управление в правильном направлении были бы замечательными. Приветствия.