gpt4 book ai didi

c# - 将 float[] 转换为 byte[] 的最快方法是什么?

转载 作者:可可西里 更新时间:2023-11-01 08:13:55 35 4
gpt4 key购买 nike

我想尽快从 float[] 中获取一个 byte[],而不是遍历整个数组(可能是通过强制转换)。不安全的代码很好。谢谢!

我正在寻找比 float 组长 4 倍的字节数组(字节数组的维数将是 float 组的维数的 4 倍,因为每个 float 由 4 个字节组成)。我会将其传递给 BinaryWriter。

编辑:对于那些尖叫“过早优化”的批评者:在优化之前,我已经使用 ANTS 分析器对此进行了基准测试。速度显着提高,因为该文件具有直写缓存,并且 float 组的大小与磁盘上的扇区大小完全匹配。二进制编写器包装了一个使用 pinvoke'd win32 API 创建的文件句柄。进行优化是因为这减少了函数调用的次数。

并且,关于内存,此应用程序创建大量缓存,使用大量内存。我可以分配一次字节缓冲区并多次重复使用它——此特定实例中的双倍内存使用量相当于应用程序整体内存消耗的舍入误差。

所以我想这里的教训是不要做出过早的假设;)

最佳答案

有一种肮脏的快速(不是不安全的代码)方法:

[StructLayout(LayoutKind.Explicit)]
struct BytetoDoubleConverter
{
[FieldOffset(0)]
public Byte[] Bytes;

[FieldOffset(0)]
public Double[] Doubles;
}
//...
static Double Sum(byte[] data)
{
BytetoDoubleConverter convert = new BytetoDoubleConverter { Bytes = data };
Double result = 0;
for (int i = 0; i < convert.Doubles.Length / sizeof(Double); i++)
{
result += convert.Doubles[i];
}
return result;
}

这会起作用,但我不确定 Mono 是否支持或更新版本的 CLR .唯一奇怪的是 array.Length 是字节长度。这可以解释为因为它查看与数组一起存储的数组长度,并且因为这个数组是一个字节数组,所以长度仍然是字节长度。索引器确实认为 Double 是八个字节大,因此那里不需要计算。

我又找了一些,实际上在 MSDN 上有描述。 , How to: Create a C/C++ Union by Using Attributes (C# and Visual Basic) ,所以 future 的版本很可能会支持它。不过我不确定 Mono。

关于c# - 将 float[] 转换为 byte[] 的最快方法是什么?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/619041/

35 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com