图片加载的性能表现

5

我已经尝试了几个小时不同的方式来从文件中加载图像,请看看这两种方法:

    public Image SlowLoad(string path)
    {
        return Image.FromFile(path);
    }

    public Image FastLoad(string path)
    {
        using (MemoryStream ms = new MemoryStream(File.ReadAllBytes(path)))
            return Image.FromStream(ms);  
    }

第二种方法的速度是第一种方法的两倍。我错过了什么?为什么会这样?我不敢相信.NET开发人员不能简单地使用我编写的方法更快地实现Image.FromFile。所以,我在某个地方错了。请告诉我哪里错了。为什么第二种方法几乎快了两倍?我的代码完全正确吗?(线程安全等)。也许Image.FromFile更安全?

1
只是提醒一下:reference.microsoft.com - user57508
1
你的第二种方法需要在读取之前将整个文件加载到内存中,而第一种方法可能不需要。也许Image.FromFile()被优化为具有低内存占用量,因此它只会从文件中一次性加载一个小缓冲区。 - adv12
2
public Image SuperFastLoad(string path) { using (MemoryStream ms = new MemoryStream(File.ReadAllBytes(path))) return Image.FromStream(ms, false, false); } - SwDevMan81
3
个人认为,如果你的图像格式允许出现跳跃偏移,那么 Image.FromFile 可能会随机访问不连续的偏移量。因此,在 Image.FromFile 的情况下,.NET BCL 的架构师们必须在内存消耗和时间之间做出妥协,并选择更少的内存消耗但加载速度较慢。如果这是真的,那么 Image.FromFile 受到硬盘跳转速度的影响,而当您将整个文件读入内存,然后让 Image.FromStream 背后的算法执行跳转时,这种情况就不会发生,因为跳跃现在发生在 RAM 中。 - Eduard Dumitru
1
@Randolph - 不确定为什么它不能工作,以下代码在LINQPad中有效:void Main() { ImageLoader l = new ImageLoader(); System.Drawing.Image t = l.SuperFastLoad(@"test.bmp"); Console.WriteLine(t.Size.ToString()); } // Define other methods and classes here public class ImageLoader { public System.Drawing.Image SuperFastLoad(string path) { using (MemoryStream ms = new MemoryStream(File.ReadAllBytes(path))) { return System.Drawing.Image.FromStream(ms, false, false); } } } - SwDevMan81
显示剩余3条评论
1个回答

2
据我所知: 首先,Image.FromFile封装了GDI+ GdipLoadImageFromFile*函数,其中一个函数的生命周期很奇怪。GDI+图像在整个生命周期中都可以使用源(文件或流),有关此的一些细节可参考http://support.microsoft.com/en-us/kb/814675。因此,这里可能存在“多个文件io”与“多个流io”的情况。 另外,在MS Reference Source System.Drawing.Image中还有一些有趣的注释:http://referencesource.microsoft.com/#System.Drawing/commonui/System/Drawing/Image.cs,181
class Image {
    ............
    public static Image FromFile(String filename,
                                     bool useEmbeddedColorManagement) 
    {
        ............    
        //GDI+ will read this file multiple times. 
        ............
    }
}

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