Вот код, который появился в моем профилировщике как самый большой потребитель ресурсов ЦП в случае, который я оптимизирую.
Код: Выделить всё
public static decimal ByteArrayToDecimal(byte[] src, int offset)
{
using (MemoryStream stream = new MemoryStream(src))
{
stream.Position = offset;
using (BinaryReader reader = new BinaryReader(stream))
return reader.ReadDecimal();
}
}
Код: Выделить всё
const byte DecimalSignBit = 128;
public static decimal ByteArrayToDecimal(byte[] src, int offset)
{
return new decimal(
BitConverter.ToInt32(src, offset),
BitConverter.ToInt32(src, offset + 4),
BitConverter.ToInt32(src, offset + 8),
src[offset + 15] == DecimalSignBit,
src[offset + 14]);
}
Однако теоретически может существовать способ скопировать эти 16 смежных байтов в какое-то другое место в памяти и объявить их десятичными без каких-либо проверок. Кто-нибудь знает, как это сделать?
(Есть только одна проблема: хотя десятичные дроби представлены в виде 16 байтов, некоторые из возможных значений не являются допустимыми десятичными дробями, так что делаю непроверенный
Код: Выделить всё
memcpyИли есть другой более быстрый способ?
Подробнее здесь: https://stackoverflow.com/questions/169 ... to-decimal
Мобильная версия