2015-03-05 10 views
5

Ho sperimentato per alcune ore con vari modi per caricare un'immagine da un file. Si prega di dare un'occhiata a questi due metodi:Prestazioni di caricamento dell'immagine

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

Il secondo metodo è come 2 volte più veloce. Cosa mi manca qui? Perché è così? Non posso credere che gli sviluppatori .NET non possano implementare Image.FromFile più velocemente semplicemente usando il metodo che ho scritto. Quindi => ho sbagliato da qualche parte. Per favore dimmi dove. Perché il secondo metodo è quasi 2 volte più veloce? Il mio codice è completamente corretto? (thread-safe, ecc.). Forse Image.FromFile è più sicuro?

+0

Sei solo misurando il tempo necessario per chiamare il metodo? Potrebbe essere che 'Image.FromFile' esegua un parsing di parsing ecc. Che' Image.FromStream' differisce. Non lo so, ma sto facendo ipotesi - puoi vedere che questo ha un impatto in un'interfaccia utente reale, ad es. che visualizza le immagini? –

+1

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

+1

Il secondo metodo richiede che l'intero file sia caricato in memoria prima di essere letto, che il primo metodo (forse) non ha. Forse Image.FromFile() è ottimizzato per un footprint di memoria insufficiente, in modo tale da caricare solo un piccolo buffer alla volta dal file. – adv12

risposta

2

AFAIK: Prima di tutto Image.FromFile esegue il wrapping delle funzioni GDI + GdipLoadImageFromFile *, quelle hanno una vita strana. GDI + image detiene e può utilizzare la fonte (file o flusso) durante l'intera vita, alcuni dettagli su di esso http://support.microsoft.com/en-us/kb/814675. Quindi, ecco alcuni possibili "multiple file io" vs "multiple stream io". Inoltre v'è qualche commento interessante in Fonte Riferimento MS 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. 
     ............ 
    } 
}