2010-10-28 29 views
6

Tôi đang tải List<Image> từ một thư mục có khoảng 250 hình ảnh. Tôi đã so sánh DateTime và mất 11 giây để tải 250 hình ảnh đó. Đó là chậm như địa ngục, và tôi rất muốn tăng tốc độ đó.Đẩy nhanh quá trình tải Danh sách hình ảnh

Hình ảnh trên đĩa cứng cục bộ của tôi, thậm chí không phải hình ảnh bên ngoài.

Mã:

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(); 
} 

EDIT: yes, tôi cần tất cả các hình ảnh. Điều tôi đang lên kế hoạch là lấy 30 pixelcolums ở giữa và tạo ra một hình ảnh mới. Kinda giống như một bức tranh 360 độ. Chỉ ngay bây giờ, tôi chỉ thử nghiệm với hình ảnh ngẫu nhiên.

Tôi biết có thể có các khuôn khổ tốt hơn để thực hiện việc này, nhưng tôi cần điều này để hoạt động trước tiên.

EDIT2: Chuyển sang đồng hồ bấm giờ, sự khác biệt chỉ là một vài phần nghìn giây. Cũng đã thử nó với Directory.EnumerateFiles, nhưng không có sự khác biệt nào cả.

EDIT3: Tôi đang chạy .NET 4, trên máy khách Win7 32 bit.

+1

Tôi thậm chí sẽ không xem mã. Bất cứ khi nào thực hiện các tiêu chuẩn hiệu suất, không sử dụng DateTime! Thay vào đó, hãy sử dụng đối tượng Đồng hồ bấm giờ. Chúng chính xác và đáng tin cậy hơn nhiều. –

+0

Tôi thường sử dụng Đồng hồ bấm giờ để thực hiện thời gian. Đã tìm thấy trong system.diagnostics. –

+0

Loại tiếp tuyến cho câu hỏi của bạn nhưng để xác định thời gian hoạt động trong mã của bạn [system.diagnostics.stopwatch] (http://msdn.microsoft.com/en-us/library/system.diagnostics.stopwatch.aspx) hoạt động như thế nào tốt hơn rất nhiều. –

Trả lời

1

Khi tải một hình ảnh làm cả tệp IO và CPU hoạt động, bạn sẽ nhận được một số speadup bằng cách sử dụng nhiều hơn sau đó một sợi.

Nếu bạn đang sử dụng .net 4, sử dụng tác vụ sẽ là cách để thực hiện.

3

Bạn có thực sự cần tải tất cả hình ảnh không? Bạn có thể nhận được đi với tải chúng lười biếng? Ngoài ra, bạn có thể tải chúng trên một chủ đề riêng biệt?

1

Vì bạn có thể đã biết đường dẫn (từ hộp thoại?), Bạn có thể sử dụng Directory.EnumerateFiles tốt hơn và sau đó làm việc với bộ sưu tập nó trả về thay vì danh sách.

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

[sửa]

chỉ nhận thấy bạn cũng đang tải các tập tin vào ứng dụng của bạn trong vòng lặp - lớn như thế nào chúng là gì? Tùy thuộc vào kích thước của nó, nó thực sự có thể là một tốc độ khá tốt!

Bạn có cần tải chúng vào thời điểm này không? Bạn có thể thay đổi một số mã hiển thị ở nơi khác để tải theo yêu cầu không?

+0

Tôi đã thử nó, nhưng không có sự khác biệt về tốc độ. Tôi cũng đã thay đổi thành đồng hồ bấm giờ, sự khác biệt chỉ là một vài phần nghìn giây. – KdgDev

2

Bạn không thể tăng tốc độ truy cập HDD và tốc độ giải mã. Tuy nhiên, một ý tưởng hay là tải hình ảnh trong một chuỗi nền.

Có lẽ bạn nên xem xét hiển thị trình giữ chỗ cho đến khi hình ảnh thực sự được tải.

Thận trọng: bạn sẽ cần phải chèn hình ảnh đã tải trong chuỗi giao diện người dùng của mình!

+2

Vâng, điều đó không hoàn toàn đúng. Anh ta có thể thay thế nó bằng một ổ SSD. – jason

+0

@ Jason: ý tôi là, theo lập trình: -D – Vlad

+0

+1 cho đề xuất hiển thị trình giữ chỗ trong khi tải hình ảnh trong chuỗi nền. –

2

Bạn có thể sử dụng Directory.EnumerateFiles cùng với Parallel.ForEach để phân phối công việc trên nhiều CPU như bạn có.

var directory = "C:\\foo"; 
var files = Directory.EnumerateFiles(directory, "*.jpg"); 
var images = files.AsParallel().Select(file => Image.FromFile(file)).ToList(); 
+0

Giả sử anh ta đang sử dụng .NET4.0 –

0

Có thể bạn không thể tăng tốc độ khi cổ chai tự đọc các tệp và có thể phân tích chúng dưới dạng hình ảnh.

Những gì bạn có thể làm là Cache danh sách sau khi nó được tải và sau đó bất kỳ cuộc gọi tiếp theo nào đến mã của bạn sẽ nhanh hơn rất nhiều.

Các vấn đề liên quan