79 votes

Mise en mémoire tampon std :: fstream vs mise en mémoire tampon manuelle (pourquoi gain 10x avec mise en mémoire tampon manuelle)?

J'ai testé les deux écrit configurations :

1) Fstream de mise en mémoire tampon :

// Initialization
const unsigned int length = 8192;
char buffer[length];
std::ofstream stream;
stream.rdbuf()->pubsetbuf(buffer, length);
stream.open("test.dat", std::ios::binary | std::ios::trunc)

// To write I use :
stream.write(reinterpret_cast<char*>(&x), sizeof(x));

2) Manuel de mise en mémoire tampon :

// Initialization
const unsigned int length = 8192;
char buffer[length];
std::ofstream stream("test.dat", std::ios::binary | std::ios::trunc);

// Then I put manually the data in the buffer

// To write I use :
stream.write(buffer, length);

Je m'attendais au même résultat...

Mais mon manuel de mise en mémoire tampon d'améliorer les performances par un facteur de 10 pour écrire un fichier de 100 mo, et la fstream de mise en mémoire tampon ne change rien par rapport à la situation normale (sans la redéfinition d'un tampon).

Quelqu'un a une explication de cette situation ?

EDIT : Voici les news : un indice de référence vient de le faire sur un superordinateur (linux 64-bit architecture, dure intel Xeon 8 core, système de fichiers Lustre et ... je l'espère bien configuré compilateurs) benchmark (et je ne l'explique pas la raison de la "résonance" pour un 1 manuel de tampon...)

EDIT 2 : Et la résonance de 1024 B (si quelqu'un a une idée à ce sujet, je suis intéressé) : enter image description here

39voto

Vaughn Cato Points 30511

C'est essentiellement due à l'appel de fonction, les frais généraux et d'indirection. Le ofstream::write() la méthode est héritée de ostream. Cette fonction n'est pas incorporé dans libstdc++, qui est la première source de surcharge. Puis ostream::write() a appeler rdbuf()->sputn() pour faire le travail d'écriture proprement dit, qui est un appel de fonction virtuelle.

En plus de cela, libstdc++ redirige sputn() à une autre fonction virtuelle xsputn() qui ajoute un autre appel de fonction virtuelle.

Si vous mettez les caractères dans la mémoire tampon de vous-même, vous pouvez éviter que les frais généraux.

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X