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?
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
Je l'ai essayé en boucle (1000 fois) - encore le premier est ~ 3 fois plus lent – Boaz
_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é. –