【发布时间】:2018-07-27 06:18:31
【问题描述】:
我有一些包含锯齿状 uint 数组的数据。
数据必须快速记录,所以我正在考虑使用 stream.Write
using (var stream = File.Open(Folder + @"\"+Filename, FileMode.OpenOrCreate))
{
// uint[][] RawData = new Uint [9000][]
foreach(uint[] LogRow in RawData)
{
stream.Write(LogRow, 0, 300);
}
}
}
但是 Stream.write 只接受字节[]
可能有可能,简单地获取 LogRow
的指针偏移量
然后因为 a uint 是 32 位,所以使用 300*4 的计数
并将 uInt[ ] Logrow 作为字节缓冲区写入?
也许宽度不安全转换?
int * ByteOffset = &LogRow;
//... ?? its a start
// but it doesnt give the LogRow as Byte[]
// not sure the best way to continou
//
---更新说明---
此代码需要使用视频数据缓冲区,因此它必须尽可能快,并且没有转换开销、额外线程、安全检查、边界检查。在过去,人们常常更多地考虑速度,因为我们编码车间的糖果更少。在当今的编码需求中还有一些领域,其中速度仍然是“主要”要求。这是这样一个问题。不要假设我通过改进我的代码的其他区域来获得更快的速度,因为你还没有看到其他区域,这也不是对这个主题的建设性讨论。
基本上,我想要的是 uint LogRow[] ,可以作为 byte[] 使用而无需转换。将其视为我不想更改的计算机内存,只需将 uint[] 视为 byte[],应该可以计算偏移量和长度并将其分配给 byte[] 数组。 . 在 c++ 或汇编程序中很容易的事情,更困难的是它的 uint[] 的锯齿状数组。提醒一下,宽度 VB 的主要区别在于 C# 确实有不安全的选项,尽管使用它们是一门艺术。
我在下面写的一个衬里是强制转换(C# 编译器将对强制转换进行边界检查),但我把它写下来只是表明我知道什么是转换,而且我不是在寻找转换答案,谁添加了额外的说明。
byte[] objectCast = (byte[])(object)LogRow;
怎么做?
【问题讨论】:
-
“数据必须快速记录”关于您在这里谈论的哪个维度?不知是否有必要深入
unsafe代码。 -
我正在潜入毫秒;)(必须快速保存原始视频缓冲区,然后才能保存下一个缓冲区)
-
转换需要复制时间,基本上我只是得到了可以直接转储的所有内存空间。 (c++ 不会介意,但这需要在 C# 中完成)。由于缓冲区确实很快到达,因此有这个速度要求。
-
写入需要几毫秒,即使在 SSD 上也是如此。转换需要纳秒。与尝试消除这一微小步骤相比,您将从一个好的异步实现中受益更多。
-
我建议将自助式写入磁盘卸载到另一个专用线程。将您的缓冲区设置为阻塞收集并让其他线程监视它。
标签: c# type-conversion