-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。
这怎么可能?是否有更高效的内存映射方式?
您第一次阅读该文件会将其页面放入文件系统缓存中。第二次读取只需要从缓存中读取。 – Mat 2013-05-05 12:04:05
我在一个循环(1000次)中尝试过它 - 仍然是第一个慢了〜3倍 – Boaz 2013-05-05 12:06:45
_I认为在内存映射文件中传递位图是最快的方法._为什么/您是否认为这样? MMF有时对随机访问更好,但对于顺序访问,简单文件可能更好。 – 2013-05-05 12:08:54