【发布时间】:2015-05-07 09:08:29
【问题描述】:
几个小时以来,我一直在试验各种从文件加载图像的方法。请看看这两种方法:
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);
}
第二种方法快 2 倍。我在这里想念什么?为什么会这样?我无法相信 .NET 开发人员无法仅使用我编写的方法更快地实现 Image.FromFile。所以=>我在某个地方错了。请告诉我在哪里。为什么第二种方法几乎快 2 倍?我的代码完全正确吗? (线程安全等)。也许 Image.FromFile 更安全?
【问题讨论】:
-
您的第二种方法要求在读取之前将整个文件加载到内存中,而第一种方法(也许)不需要。也许 Image.FromFile() 已针对低内存占用进行了优化,因此它一次只从文件中加载一个小缓冲区。
-
public Image SuperFastLoad(string path) { using (MemoryStream ms = new MemoryStream(File.ReadAllBytes(path))) return Image.FromStream(ms, false, false); } -
恕我直言
Image.FromFile可能会随机访问文件中不连续的偏移量,假设您的图像格式是一种可能发生这种跳转的格式。所以在Image.FromFile的情况下,.NET BCL 的架构师不得不在内存消耗和时间之间做出妥协,他们选择了更少的内存消耗但更慢的加载。如果这是真的,那么Image.FromFile会受到硬盘跳转速度的影响,当您读取内存中的整个文件然后让Image.FromStream后面的算法进行跳转时,不会发生这种情况,这些跳转现在发生在 RAM 中跨度> -
@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); } } }