2013-05-05 68 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对象。