将byte*传递给Stream.Read(byte[], int, int)函数

4
.NET函数Stream.Read()需要一个byte[]作为参数。我是否可以传递一个stackalloc'd byte*?这将避免我进行额外的堆分配,并在回收垃圾时节省时间。该函数很短,会被重复调用。

3
建议:不要过度优化。您认为使用“new byte [n]”会有显著的性能惩罚吗? - John Saunders
因为垃圾回收器需要花费资源来检查并最终释放它。这就是为什么 stackalloc 最初被创建的原因。我正在开发一个处理声音样本的音频库。对于 CD 音频,每秒有 44,100 个样本。这个例程将会被频繁调用。 - wswartzendruber
在你让它更快之前,先确保它能正确运行。否则你就有可能得到一些非常快但是错误的代码。 - John Saunders
我正在考虑共享一个单一的缓冲区,供多个不同的函数用作沙盒。感谢 [ThreadStatic],我相信我可以做到。 - wswartzendruber
@wswartzendruber 另一个可能更安全的选择是使用 Array Pool - pquest
显示剩余3条评论
2个回答

3
你不能这样做。你需要先创建一个数组,然后将其复制到那里。另请参见MSDN论坛上的此线程
除此之外:我不知道你的应用程序的上下文,但也许你可以使用一个静态分配的缓冲区?在多线程环境中,你可以像这样在TLS中分配缓冲区:
class SomeDataProcessor
{
    [ThreadStatic]
    static byte[] _Buffer;
}

请注意,您需要小心初始化程序。有关详细信息,请参见此处

哇,我想我们有一个赢家! - wswartzendruber

-1

我不认为你能够这样做,但是如果你想简化转换,你可以使用:

System.Runtime.InteropServices.Marshal.Copy

接受未管理的地址、大小、字节缓冲等。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接