我将大量位图(屏幕截图)保存到内存中。没有什么特别的代码,它是微不足道的:
var memory = new MemoryStream();
bitmap.Save(memory, ImageFormat.Png);
由于我的PC速度有点慢,我在Visual Studio中运行了性能分析会话,我发现Save()
调用需要37%的"包含样本"。保存到磁盘时使用另一个重要部分,因此当不保存到磁盘时,这些37%更可能是80%。 (我现在不关心保存到磁盘。所有数据都保存在RAM中,直到按下热键,我几乎没有影响硬盘速度。)
根据我的理解,Save()
电话必须转换或多或少的" raw"将位图数据转换为压缩的PNG文件格式。
我想知道某人是否对Save()
方法的处理时间有不同图像格式的性能概述。即使文件大小较大,我也希望选择最快的格式。
我试过了:
ImageFormat.MemoryBmp
但会引发ArgumentNullException
:
值不能为空。参数名称:encoder
我发现a related question描述了某些图像格式是只读的,这会略微减少列表。
答案 0 :(得分:1)
这些是在Intel i7 CPU上截取3个显示器的屏幕截图的非代表性结果,其中应用程序仅分配了一个核心。我正在运行x64版本构建并保存到预先分配的内存缓冲区。
GIF : ~5.5% CPU load
TIFF: ~4.5% CPU load
PNG : ~4.0% CPU load
JPG : ~2.0% CPU load (note that this is lossy)
BMP : ~1.0% CPU load
我也尝试集成Magick.NET,但由于我无法弄清楚如何从Graphics
创建MagickImage
对象以保存屏幕截图,我不得不使用构造函数以Bitmap
为参数。这导致PNG图像的CPU负载约为10.0%。