2013-05-05 69 views
-1

我有一個不同的進程,它會生成很多位圖(最終它會模擬視頻),並且我希望它顯示在C#應用程序中。從內存映射文件中讀取位圖比直接從磁盤中讀取要慢

我認爲提供內存映射文件中的位圖是最快的方法。當我運行以下代碼時,我發現直接從磁盤構建位圖速度更快。

int length = 153718; 
    var mmf1 = MemoryMappedFile.CreateFromFile(@"C:\tests\test.bmp", 
               FileMode.OpenOrCreate, 
               null); 
    var reader = mmf1.CreateViewAccessor(0, 0, MemoryMappedFileAccess.Read); 
    byte[] buffer = new byte[length]; 
    MemoryStream memstream = new MemoryStream(buffer); 

    Stopwatch stopwatch = new Stopwatch(); 

    stopwatch.Start(); 

    reader.ReadArray<byte>(0, buffer, 0, length); 
    Bitmap bmp = new Bitmap(memstream); 

    stopwatch.Stop(); 
    Console.WriteLine("Time elapsed: {0}", 
     stopwatch.Elapsed); 

    stopwatch.Reset(); 
    stopwatch.Start(); 

    Bitmap bmp2 = new Bitmap(@"C:\tests\test2.bmp"); 

    stopwatch.Stop(); 
    Console.WriteLine("Time elapsed: {0}", 
     stopwatch.Elapsed); 

結果是:

經過時間:00:00:00.0074231
經過時間:00:00:00.0023245

我計時只是重複的代碼將運行(不包括設置)
兩個位圖都是相同的圖像,相當小的640 * 480 bmp。

這怎麼可能?是否有更高效的內存映射方式?

+0

您第一次閱讀該文件會將其頁面放入文件系統緩存中。第二次讀取只需要從緩存中讀取。 – Mat 2013-05-05 12:04:05

+0

我在一個循環(1000次)中嘗試過它 - 仍然是第一個慢了〜3倍 – Boaz 2013-05-05 12:06:45

+1

_I認爲在內存映射文件中傳遞位圖是最快的方法._爲什麼/您是否認爲這樣? MMF有時對隨機訪問更好,但對於順序訪問,簡單文件可能更好。 – 2013-05-05 12:08:54

回答

2

這並不奇怪。從內存映射文件中讀取陣列中的內存流會增加數據必須通過的額外層。

內存映射文件充當文件和視圖訪問器之間的層,提供對文件的隨機訪問。由於您一次讀取所有數據,因此不使用此功能,因此直接從文件讀取數據到數組中的速度會比從內存映射文件中讀取數據快。

內存流作爲數組和流之間的另一層讀取。基本上它將所有數據複製到另一個緩衝區,然後將其傳送到Bitmap對象。