Écrire des tampons volumineux dans des fichiers binaires en C : optimiser les performances
La question d'origine :
Lorsque vous tentiez d'écrire de grandes quantités de données (80 Go) sur un SSD, le code C fourni à l'aide de std :: fstream atteignait des vitesses d'environ 20 Mo/s, nettement plus lent que les taux de transfert attendus d'un SSD. La question recherche des méthodes pour optimiser le processus d'écriture.
La solution :
Option 1 : Utiliser std::fstream avec sync_with_stdio(false)
Cette approche utilise std::fstream avec le drapeau sync_with_stdio(false), qui désactive la synchronisation entre les flux d'E/S C et C. En dissociant les flux, il améliore les performances sur certains systèmes en réduisant la surcharge de formatage et de vidage des données.
Option 2 : exploitation des fonctions d'E/S standard C
Ceci L'option utilise des fonctions d'E/S standard C de bas niveau (fopen, fwrite et fclose) pour écrire des données dans le fichier binaire. C I/O fonctionne à un niveau inférieur à std::fstream, offrant un meilleur contrôle sur les opérations sur les fichiers et des performances potentiellement supérieures.
Mesures mises à jour :
Pour déterminer l'efficacité de chaque approche dans les scénarios actuels, un code révisé et des mesures ont été effectués dans 2017 :
Code :
Le code mis à jour utilise des techniques plus avancées, telles que la génération de données, la synchronisation avec l'horloge haute résolution et la manipulation flexible de la taille du tampon.
Résultats :
Les mesures ont révélé que les deux options 1 (en utilisant std::fstream avec sync_with_stdio(false)) et l'option 3 (utilisant les fonctions d'E/S standard C) ont pleinement utilisé les capacités d'écriture du SSD, atteignant des vitesses d'écriture similaires.
Conclusion :
La meilleure approche pour écrire des tampons volumineux dans des fichiers binaires en C dépend des configurations matérielles et logicielles spécifiques. En général, std::fstream avec sync_with_stdio(false) et les fonctions d'E/S standard C offrent des performances efficaces. En éliminant les goulots d'étranglement, ces techniques permettent un transfert de données optimisé et rapide vers les SSD.
Ce qui précède est le contenu détaillé de. pour plus d'informations, suivez d'autres articles connexes sur le site Web de PHP en chinois!