mmap est de façon plus rapide. Vous pouvez écrire une simple référence pour le prouver à vous-même:
char data[0x1000];
std::ifstream in("file.bin");
while (in)
{
in.read(data, 0x1000);
// do something with data
}
contre:
const int file_size=something;
const int page_size=0x1000;
int off=0;
void *data;
int fd = open("filename.bin", O_RDONLY);
while (off < file_size)
{
data = mmap(NULL, page_size, PROT_READ, 0, fd, off);
// do stuff with data
munmap(data, page_size);
off += page_size;
}
Clairement, je suis en laissant de côté les détails (comme la façon de déterminer quand vous avez atteint la fin du fichier dans le cas où votre fichier n'est pas un multiple de page_size
, par exemple), mais ça ne devrait pas être beaucoup plus compliqué que cela.
Si vous le pouvez, vous pouvez essayer de briser vos données dans plusieurs fichiers qui peuvent être mmap()-ed dans son ensemble plutôt que dans la partie (beaucoup plus simple).
Il y A quelques mois j'ai eu une demi-cuite de la mise en œuvre d'un coulissante de la fenêtre de mmap()-ed classe de flux pour boost_iostreams, mais personne ne se souciait et je me suis occupé avec d'autres choses. Malheureusement, j'ai supprimé des archives de vieux projets non achevés il y a quelques semaines, et qui a été l'une des victimes :-(
Mise à jour: je dois également ajouter l'avertissement que ce test sera assez différent dans Windows parce que Microsoft a mis en place un astucieux fichier cache qui réalise la plupart de ce que vous feriez avec mmap en premier lieu. I. e., souvent d'accéder à des fichiers, vous pouvez simplement faire std::ifstream.read (), et il serait aussi vite que mmap, car le fichier de cache aurais déjà fait une projection en mémoire pour vous, et c'est transparent.
Dernière mise à Jour: Regardez, les gens: à travers un grand nombre de différentes combinaisons de plate-forme de l'OS et de la norme des bibliothèques et des disques et de la mémoire des hiérarchies, je ne peux pas dire à certains que l'appel système mmap
, considéré comme une boîte noire, toujours toujours toujours être sensiblement plus rapide que l' read
. Ce n'était pas exactement mon intention, même si mes mots pourraient être interprétées de cette façon. En fin de compte, mon point était que memory-mapped i/o est généralement plus rapide que d'octets d'e/s; c'est encore vrai. Si vous trouvez expérimentalement qu'il n'y a pas de différence entre les deux, la seule explication qui me semble raisonnable, c'est que votre plate-forme met en œuvre de carte mémoire sous les couvertures dans une manière qui est avantageux pour la performance d'appels à l' read
. La seule façon d'être absolument certain que vous êtes à l'aide de memory-mapped i/o dans un portable est d'utiliser mmap
. Si vous n'avez pas de soins sur la portabilité et vous pouvez compter sur les caractéristiques de votre cible plates-formes, puis à l'aide de read
peut être adapté sans pour autant sacrifier sensiblement les performances.