2009-11-08 10 views
2

J'écris un ensemble de tests unitaires qui écrivent des valeurs calculées dans des fichiers. Chaque test produit une matrice carrée qui contient entre 50 000 et 500 000 doubles, et j'ai un total de 128 combinaisons de cas de test.C++ ofstream vs C++ cout piped to file

Y at-il les frais généraux importants impliqués dans l'écriture d'instructions et la tuyauterie cout que la sortie vers des fichiers, ou serais-je mieux d'écrire directement dans le fichier en utilisant un ofstream?

Répondre

8

Cela dépend de votre système et de votre environnement. Cela peut être très peu de différence, mais il n'y a qu'une seule façon d'être sûr: essayez les deux approches et mesurez-les.

1

Les dimensions impliquées sont si grands Je suppose que ces fichiers ne sont pas destinés à être lus par un être humain? Assurez-vous simplement de les écrire en tant que texte binaire et non humainement lisible parce que cela fera tellement plus de différence que la différence entre l'utilisation de cout de tuyau ou de tuyauterie.

Si cela signifie que vous avez à utiliser ofstream ou non, je ne sais pas. Je ne l'ai jamais écrit binaire je ne peux cout pas dire si cela est possible ...

+0

Hmmm, une autre réponse, un autre downvote anonyme. Si je ne savais pas mieux, je dirais que quelqu'un avec rancune me suivait ... – Troubadour

0

Comme l'a dit Charles Bailey, il est dépendant de la mise en œuvre; ce qui suit est principalement pour l'implémentation de linux avec gnu toolchain, mais j'imagine difficilement qu'il soit très différent dans d'autres os.

En libstdC++ 4.4.2:

  • Un fstream contiennent un stdio_filebuf sous-jacente qui est un basic_filebuf. Ce basic_filebuf contient son propre tampon en héritant basic_streambuf, et contient en fait un fichier __basic_file, lui-même contenant une abstraction C stdio C sous-jacente (FILE * ou std :: __ c_file *), dans laquelle il vide la mémoire tampon. Cout, qui est un ostream est initialisé avec un stdio_sync_filebuf lui-même initialisé avec le stdout d'abstraction du fichier C. stdio_sync_filebuf appelle les fonctions simples de C stdio.

Considérant que C++, il semble qu'un fstream peut être plus efficaces grâce à deux couches de tampon. Considérant seulement C, si le processus est forké avec le descripteur de fichier stdout redirigé dans un fichier, il ne devrait y avoir aucune différence entre écrire dans un nouveau fichier ouvert (ce que fait fstream à la fin) ou stdout depuis le point fd à un fichier de toute façon (ce que cout fait à la fin).

Si j'étais vous, j'utiliserais un fstream puisque c'est votre intention.