2013-05-05 4 views
-1

J'ai un processus différent qui générera beaucoup de bitmaps (éventuellement il va simuler une vidéo) et je veux l'afficher sur une application C#.lire un bitmap à partir d'un fichier mappé en mémoire est plus lent que directement à partir du disque

Je pensais que la livraison des bitmaps dans un fichier mappé en mémoire est le moyen le plus rapide. Lorsque j'ai exécuté le code suivant, j'ai découvert que la construction d'un bitmap directement à partir du disque est plus rapide.

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

Le résultat est:

Temps écoulé: 00: 00: 00,0074231
Temps écoulé: 00: 00: 00,0023245

Je minutée le code récurrent qui se déroulera (n'inclut pas la configuration)
Les deux bitmaps sont la même image, plutôt petit 640 * 480 bmp.

Comment est-ce possible? Y a-t-il un moyen de mappage de la mémoire plus efficace?

+0

Votre première lecture du fichier placera ses pages dans le cache du système de fichiers. La seconde lecture n'aura qu'à lire dans le cache. – Mat

+0

Je l'ai essayé en boucle (1000 fois) - encore le premier est ~ 3 fois plus lent – Boaz

+1

_Je pensais que délivrer les bitmaps dans un fichier mappé en mémoire est le moyen le plus rapide._ Pourquoi avez-vous pensé? MMF est parfois meilleur pour un accès aléatoire mais pour un accès séquentiel, un fichier simple est probablement mieux optimisé. –

Répondre

2

Ce n'est pas surprenant. La création d'un flux de mémoire à partir d'un tableau lu à partir d'un fichier mappé en mémoire ajoute des couches supplémentaires que les données doivent traverser.

Le fichier mappé en mémoire agit comme une couche entre l'accesseur de fichier et de vue, fournissant un accès aléatoire à un fichier. Vous n'utilisez pas cette fonctionnalité car vous lisez toutes les données à la fois, donc lire les données directement à partir du fichier dans le tableau serait plus rapide que de le lire à partir d'un fichier mappé en mémoire.

Le flux de mémoire agit comme une autre couche entre le tableau et le flux lu par celui-ci. Fondamentalement, il copie toutes les données à travers un autre tampon avant de le livrer à l'objet Bitmap.

Questions connexes