sbo*_*sse 27 c# performance png decode decoding
在将结果发送到Web客户端之前,我们的Web服务器需要将大量图像组合在一起.此过程对性能至关重要,因为服务器每小时可以接收数千个请求.
现在我们的解决方案从HD加载PNG文件(每个大约1MB)并将它们发送到视频卡,以便在GPU上完成合成.我们首先尝试使用XNA API公开的PNG解码器加载我们的图像.我们看到表现不太好.
要了解问题是从HD加载还是解码PNG,我们通过将文件加载到内存流中,然后将该内存流发送到.NET PNG解码器来修改它.使用XNA或使用System.Windows.Media.Imaging.PngBitmapDecoder类的性能差异并不重要.我们大致获得相同的性能水平.
我们的基准测试显示以下性能结果:
总计:3680.50ms 100%
从这些结果中我们看到最慢的部分是在解码PNG时.
所以我们想知道是否会有我们可以使用的PNG解码器,这将允许我们减少PNG解码时间.我们还考虑将图像保持在硬盘上不压缩,但是每个图像的大小为10MB而不是1MB,并且由于硬盘上存储了数万个这样的图像,因此无法存储它们.压缩.
编辑:更有用的信息:
还有另一种选择.也就是说,您编写自己的基于GPU的PNG解码器.您可以使用OpenCL来相当有效地执行此操作(并使用OpenGL执行您的组合,OpenGL可以与OpenCL共享资源).还可以交错传输和解码以获得最大吞吐量.如果这是您可以/想要追求的路线,我可以提供更多信息.
以下是与基于GPU的DEFLATE(和INFLATE)相关的一些资源.
希望这可以帮助!
您是否尝试过以下两件事。
1)
多线程,有多种方法可以做到这一点,但其中一种是“all in”方法。对于整个过程来说,基本上完全生成 X 数量的线程。
2)
也许考虑让XX线程完成所有CPU工作,然后将其提供给GPU线程。
对于新用户来说,您的问题非常明确,但是有关 senario 的一些信息可能有用吗?我们是在谈论批量作业还是实时服务图片?10k张图片有变化吗?
硬件资源
您还应该考虑您拥有哪些硬件资源。通常,最便宜的两个因素是 CPU 能力和磁盘空间,因此,如果您只有 10k 很少变化的图片,那么将它们全部转换为更快处理的格式可能是最佳选择。
多线程琐事
进行多线程处理时要考虑的另一件事是,通常明智地使线程处于 BellowNormal 优先级。因此,您不会使整个系统“滞后”。您必须对要使用的线程数量进行一些试验,如果您幸运的话,您可以在 CORE 上获得接近 100% 的速度增益,但这在很大程度上取决于您运行的硬件和代码。
我通常使用Environment.ProcessorCount来获取当前的 CPU 计数并从那里开始工作:)
| 归档时间: |
|
| 查看次数: |
5584 次 |
| 最近记录: |