6

我正在List<Image>从大约 250 张图像的文件夹中加载一个。我做了一个 DateTime 比较,加载这 250 张图像需要整整 11 秒。这太慢了,我非常想加快速度。

这些图像在我的本地硬盘上,甚至不是外部硬盘。

编码:

DialogResult dr = imageFolderBrowser.ShowDialog();
if(dr == DialogResult.OK) {

    DateTime start = DateTime.Now;

    //Get all images in the folder and place them in a List<>
    files = Directory.GetFiles(imageFolderBrowser.SelectedPath);
    foreach(string file in files) {
        sourceImages.Add(Image.FromFile(file));
    }
    DateTime end = DateTime.Now;

    timeLabel.Text = end.Subtract(start).TotalMilliseconds.ToString();
}

编辑:是的,我需要所有的图片。我的计划是取每个中心的 30 个像素列,并从中制作一个新图像。有点像360度全景。只是现在,我只是用随机图像进行测试。

我知道可能有更好的框架可以做到这一点,但我首先需要它。

EDIT2:切换到秒表,差异只有几毫秒。还用 Directory.EnumerateFiles 尝试过,但完全没有区别。

EDIT3:我在 32 位 Win7 客户端上运行 .NET 4。

4

6 回答 6

3

你真的需要加载所有的图像吗?您可以懒惰地加载它们吗?或者,您可以将它们加载到单独的线程上吗?

于 2010-10-28T20:28:19.537 回答
2

您无法加快 HDD 访问和解码速度。然而,一个好主意是在后台线程中加载图像。

也许您应该考虑在实际加载图像之前显示一个占位符。

注意:无论如何,您都需要在 UI 线程中插入加载的图像!

于 2010-10-28T20:29:29.757 回答
2

您可以使用 Directory.EnumerateFiles 和 Parallel.ForEach 将工作分散到尽可能多的 CPU 上。

var directory = "C:\\foo";
var files = Directory.EnumerateFiles(directory, "*.jpg");
var images = files.AsParallel().Select(file => Image.FromFile(file)).ToList();
于 2010-10-28T20:34:48.393 回答
1

由于加载图像会同时执行文件 IO 和 CPU 工作,因此您应该通过使用多个线程来获得一些速度。

如果您使用的是 .net 4,那么使用任务将是可行的方法。

于 2010-10-28T20:29:03.243 回答
1

鉴于您可能已经知道路径(从对话框中?),您可能会更好地使用 Directory.EnumerateFiles 然后使用它返回的集合而不是列表。

http://msdn.microsoft.com/en-us/library/dd383458.aspx

[编辑]

刚刚注意到您还在循环中将文件加载到您的应用程序中 - 它们有多大?根据它们的大小,它实际上可能是一个相当不错的速度!

此时您需要加载它们吗?您可以在其他地方更改一些显示代码以按需加载吗?

于 2010-10-28T20:29:19.427 回答
0

您可能无法加快速度,因为瓶颈正在从磁盘读取文件本身并将它们解析为图像。

不过,您可以做的是在列表加载后对其进行缓存,然后对代码的任何后续调用都会快得多。

于 2010-10-28T21:57:18.500 回答