2017-05-22 3 views
0

Je suis nouveau en C++ et je fais une application qui utilise beaucoup de putc pour écrire des données dans une sortie qui est un fichier. En raison de son ralentissement, je code en Delphi, donc je sais comment le résoudre, comme créer un flux mémoire et y écrire chaque fois que nous avons besoin d'écrire en sortie, et si la taille du flux mémoire est plus grande que la taille du tampon que nous voulons, l'écrire en sortie et effacer le flux de mémoire. Comment dois-je faire cela avec C++ ou une meilleure solution?Buffering putc écrire

+2

Y at-il une raison particulière pour l'utilisation '' putc'' et non un I déjà en mémoire tampon/Fonction O (fonction large: flux STL, printf, ...)? – nefas

+0

Son processeur un peu sage, donc putc semblait être l'option la plus rapide pour moi – Joruun

+0

Vous pourriez vouloir vérifier cela [fwrite déjà tamponné] (https://stackoverflow.com/questions/2806104/does-fwrite-buffer-the-output – Sniper

Répondre

0

L'écriture dans un fichier doit être très rapide. C'est généralement la vidange du tampon qui prend un certain temps. Envisagez d'utiliser le caractère \n au lieu de std::endl.

+0

Voici combien écrit sa prise: IO Write: 497 Mo (en 127406 écrit) et l'écriture de données binaires. – Joruun

+0

Cela ne devrait pas prendre trop de temps. Si vous ne videz pas manuellement votre mémoire tampon, la vitesse doit être proche de la vitesse maximale de lecture du disque. Si vous êtes vraiment bloqué, essayez de tout mettre dans un fichier std :: stream (qui devrait automatiquement ignorer les vidages du tampon), puis videz le flux dans un fichier. –

+0

Voici une bonne explication, et quelques micro-benchmarking: https://www.youtube.com/watch?v=GMqQOEZYVJQ –

0

Je pense qu'une bonne réponse à votre question est ici: Writing a binary file in C++ very fast

Si la réponse est:

#include <stdio.h> 
const unsigned long long size = 8ULL*1024ULL*1024ULL; 
unsigned long long a[size]; 

int main() 
{ 
    FILE* pFile; 
    pFile = fopen("file.binary", "wb"); 
    for (unsigned long long j = 0; j < 1024; ++j){ 
     //Some calculations to fill a[] 
     fwrite(a, 1, size*sizeof(unsigned long long), pFile); 
    } 
    fclose(pFile); 
    return 0; 
} 

La chose la plus importante dans votre cas est d'écrire autant de données que vous pouvez, avec demandes d'E/S les moins possibles.

+0

Qu'y a-t-il avec la chose 'unsigned long long'? – spectras

+0

Vous avez besoin du plus grand nombre entier positif (pas int) – imoutidi

+1

Pour quoi faire? Si vous parlez de la taille d'écriture, il existe un type spécifique à cette fin, 'size_t'. Il est défini par la norme C99 en C (je ne me souviens plus lequel pour C++), et garanti pouvoir contenir la taille de n'importe quel objet qui tient dans la mémoire. Vous l'obtenez soit ':: size_t' à partir de' stddef.h' (héritage) ou 'std :: size_t' à partir de' cstddef' en-tête (courant). Ils ne sont pas nécessairement les mêmes. – spectras

1

putc est déjà en mémoire tampon, 4 Ko est par défaut que vous pouvez utiliser setvbuf pour changer cette valeur: D

setvbuf