分配字节数组是否对性能至关重要?

Uwe*_*eim 5 .net c# performance generic-handler

在我的小型文件传输网站(这个网站,运行 .NET 4.5.1)中,我按照 Microsoft 知识库文章812406将以前上传的文件从服务器发送到浏览器。

做性能优化我很惊讶地发现那行

var buffer = new byte[10000];
Run Code Online (Sandbox Code Playgroud)

需要相当长的时间(我使用的是 Red Gate 的ANTS Performance Profiler)。每个完整下载/客户端仅分配一次缓冲区。

我的问题:

  • 以这种方式和这种大小分配缓冲区是一种好习惯吗?
  • 分配 ?10k 缓冲区的任何替代方案?

更新 1:

感谢您的评论,我已经看到内存也在循环内分配。

尽管如此,ANTS Profiler 只会将循环的分配标记为花费那么多时间,老实说,我(目前)还不明白这一点。我已经删除了循环内的(无意义的)分配。

更新 2:

实施了建议BufferManager并将缓冲区大小从 10k 减少到 4096(以防万一……)后,我的网站几天以来一直运行非常流畅。

vto*_*ola 4

是的。实际上,WCF使用“缓冲区管理器”来防止这个问题

我自己一直在开发网络服务,在分析过程中我发现Byte[]缓冲区的分配造成了瓶颈。不仅在分配过程中,处理器在 GC 中浪费的时间也非常高。重用这些缓冲区并避免分配的改进产生了非常大的性能改进。

您可以使用该类BufferManager来避免编写自己的缓冲区管理策略。