如果我有一个字节数组,想要将该数组中一个连续的16字节块,包含 .net 的
以下是在优化案例中出现在我的分析器中作为最大 CPU 消耗者的代码。
为了摆脱使用
这比使用MemoryStream/BinaryReader组合快10倍,我已经使用了一堆极端值进行测试,以确保它可以正常工作,但是十进制表示法不像其他原始类型那样直接,所以我还没有完全相信它可以处理所有可能的十进制值。
理论上,有一种方法可以将这16个连续字节复制到内存中的其他位置,并声明为Decimal,而无需任何检查。是否有人知道如何做到这一点?
(只有一个问题:尽管十进制数表示为16个字节,但某些可能的值并不构成有效的十进制数,因此进行未经检查的
还有其他更快的方法吗?
Decimal
表示方式,转换为一个正确的 Decimal
结构体,最有效的方法是什么?以下是在优化案例中出现在我的分析器中作为最大 CPU 消耗者的代码。
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();
}
}
为了摆脱使用
MemoryStream
和BinaryReader
,我认为将一个BitConverter.ToInt32(src, offset + x)
数组输入到Decimal(Int32[])
构造函数中比下面我提供的解决方案更快,但是下面的版本奇怪地快了两倍。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]);
}
这比使用MemoryStream/BinaryReader组合快10倍,我已经使用了一堆极端值进行测试,以确保它可以正常工作,但是十进制表示法不像其他原始类型那样直接,所以我还没有完全相信它可以处理所有可能的十进制值。
理论上,有一种方法可以将这16个连续字节复制到内存中的其他位置,并声明为Decimal,而无需任何检查。是否有人知道如何做到这一点?
(只有一个问题:尽管十进制数表示为16个字节,但某些可能的值并不构成有效的十进制数,因此进行未经检查的
memcpy
可能会破坏事情...)还有其他更快的方法吗?
BinaryReader
很慢。但是,无论多快,通过不必要的间接方式显然都会减慢速度。如果一开始我就有了BinaryReader
而不是一个字节数组,我怀疑调用它的ReadDecimal
方法读取十进制数的速度不会更快。 - Evgeniy Berezovsky