Я провел исследование времени, необходимого для сериализации базового типа в байтовый массив. Я сделал это для случая, когда у вас уже есть массив и смещение, где вы хотите поместить свои данные. Я думаю, это действительно важный случай, по сравнению с теоретическим, получить массив из 4 байтов, потому что когда вы сериализуете что-то, то это именно то, что вам нужно. Я понял, что ответ на какой метод быстрее зависит от того, какой тип вы хотите сериализовать. Я попробовал несколько методов:
- небезопасной ссылку с дополнительной проверкой переполнения буфера
- GetBytes + последующее Buffer.BulkCopy (Это, по существу такой же, как 1 плюс накладные расходы)
- Прямого присвоения со сдвигом (
m_Bytes[offset] = (byte)(value >> 8)
- приписывания со сдвигом и побитового &
m_Bytes[offset] = (byte)((i >> 8) & 0xFF)
Я провел весь тест 10 миллионов раз. Ниже приведены результаты в миллисекундах
Long Int Short Byte Float Double
1 29 32 31 30 29 34
2 209 233 220 212 208 228
3 63 24 13 8 24 44
4 72 29 14
Как вы можете видеть, что небезопасно путь намного быстрее долго и двойной (неподписанные версии о том же, как и их подписанных версиях, так что они не находятся в таблице). Для short/int/float самым быстрым способом является назначение 2/4/4 со сдвигом. Для байта наиболее быстрым является, очевидно, простое назначение. Так что в отношении исходного вопроса - путь назначения является лучшим. Это пример такой функции самым быстрым способом:
public static void WriteInt(byte[] buffer, int offset, int value)
{
m_BytesInt[offset] = (byte)(value >> 24);
m_BytesInt[offset + 1] = (byte)(value >> 16);
m_BytesInt[offset + 2] = (byte)(value >> 8);
m_BytesInt[offset + 3] = (byte) value;
}
P.S. Тесты выполнялись в среде x64 с кодом, скомпилированным для процессора (который был x64 при запуске) в режиме выпуска.
Под «самым быстрым» вы подразумеваете a) наименьшее количество кода или b) наилучшую производительность? –
Лучшая производительность – MichaelT
«Самый быстрый» зависит от того, где вы хотите, чтобы эти байты были отправлены. –