2015-03-05 18 views
5

Przez kilka godzin eksperymentowałem z różnymi sposobami załadowania obrazu z pliku. Proszę spojrzeć na te dwie metody:Wydajność wczytywania obrazów

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

Druga metoda jest 2 razy szybsza. Czego tu mi brakuje? Dlaczego tak jest? Nie mogę uwierzyć, że programiści .NET nie mogliby szybciej zaimplementować Image.FromFile przy użyciu metody, którą napisałem. So => Gdzieś się mylę. Powiedz mi gdzie. Dlaczego druga metoda jest prawie 2 razy szybsza? Czy mój kod jest w pełni poprawny? (wątek bezpieczny, itp.). Może Image.FromFile jest bardziej bezpieczny?

+0

Czy jesteś tylko pomiar czasu zadzwonić do metody? Może się zdarzyć, że 'Image.FromFile' zrobi parsowanie etc, które' Image.FromStream' odstrasza. Nie wiem, ale spekuluję - czy widzisz, że ma to wpływ na prawdziwy interfejs użytkownika, np. który wyświetla obrazy? –

+1

Tylko fyi: [reference.microsoft.com] (http://referencesource.microsoft.com/#System.Drawing/commonui/System/Drawing/Image.cs,f7cc7221ba00597a) –

+1

Twoja druga metoda wymaga, aby cały plik był ładowane do pamięci przed odczytaniem, czego pierwsza metoda (być może) nie ma. Może Image.FromFile() jest zoptymalizowany pod kątem niskiego zużycia pamięci, tak, że ładuje tylko mały bufor naraz z pliku. – adv12

Odpowiedz

2

AFAIK: Przede wszystkim Image.FromFile opakowuje funkcje GDI + GdipLoadImageFromFile *, które mają dziwne życie. GDI + image przechowuje i może używać źródła (plik lub strumień) przez całe życie, niektóre szczegóły na ten temat http://support.microsoft.com/en-us/kb/814675. Oto kilka możliwych "wielu plików io" kontra "wiele strumieni io". Ponadto istnieje jakiś ciekawy komentarz w MS Referencyjnego Źródło 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. 
     ............ 
    } 
}