从内存映射文件中读取位图要比直接从磁盘读取慢

本文关键字:读取 磁盘 位图 内存 映射 文件 | 更新日期: 2023-09-27 18:12:06

我有一个不同的过程,将生成很多位图(最终它将模拟视频),我希望它显示在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。

这怎么可能?有没有更有效的内存映射方式?

从内存映射文件中读取位图要比直接从磁盘读取慢

这并不奇怪。从内存映射文件中读取数组中的内存流增加了数据必须通过的额外层。

内存映射文件作为文件和视图访问器之间的层,提供对文件的随机访问。当您一次读取所有数据时,您不会使用此功能,因此直接从文件中将数据读入数组将比从内存映射文件中读取数据要快。

内存流充当数组和从中读取的流之间的另一层。基本上,它在将所有数据传递给Bitmap对象之前,通过另一个缓冲区复制所有数据。