Bonjour,
J’aimerais avoir votre avis pour optimiser le temps de calcul d’un code.
Pour résumer grossièrement mon code :
• J’ai une classe qui contient une méthode de calcul
• Mon main
Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3
4
5
6 Class object { public: object(QString objectName = "Not set"); double computeValue(const double param1, const double param2) {return lectureFichier(param1, param2);} }
avec NOMBRE qui peut être très très élevé (typiquement plusieurs millions) et valeur1 et valeur2 issus d’un calcul non « prévisible » (combinaison d’aléas).
Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3 for(unsigned long long i=0 ; i<NOMBRE ; i++) object->computeValue(valeur1, valeur2);
• Une bibliothèque de fonctions :
Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3
4
5
6
7
8
9
10 // Le .h #ifndef BIBLIFUNCTIONS_H #define BIBLIFUNCTIONS _H #include <iostream> #include <fstream> double lectureFichier(const double param1, const double param2); #endifLe fichier est une série de 260000 doubles (implicitement organisés en un tableau de 720 par 360). C’est un binaire de 2Mo. Ces fonctions se trouvent dans une bibliothèque à part car elles sont appelées à plusieurs endroits. Je précise également que je ne fais que lire le fichier (je ne fais jamais d’écriture).
Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3
4
5
6
7
8
9
10
11
12
13 // Le .cpp #include "bibliFunctions.h" double lectureFichier(const double param1, const double param2) { ifstream file(PATH_FILE, ios::in | ios::binary); Index = FUNCTION(param1, param2); file.seekg(index*SIZE_OF_DOUBLE); file.read(reinterpret_cast<char *>(&values), 4*SIZE_OF_DOUBLE); file.close(); return FONCTION(values) ; // Calcule 1 valeur en utilisant les 4 valeurs lues dans le fichier }
Mon problème est que j’ouvre et ferme de très nombreuses fois le ficher, ce qui me pénalise en temps de calcul.
J’ai d’abord pensé à faire ceci :
Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3
4
5
6
7
8
9
10
11
12 // Le .h #ifndef BIBLIFUNCTIONS_H #define BIBLIFUNCTIONS _H #include <iostream> #include <fstream> static std::ifstream file(PATH_FILE, std::ios::in | std::ios::binary); double lectureFichier(const double param1, const double param2); #endifC’est bien plus rapide (je n’ouvre le fichier plus qu’une fois) mais je ne sais pas comment faire pour appeler le file.close().
Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3
4
5
6
7
8
9
10 // Le .cpp #include "bibliFunctions.h" double lectureFichier(const double param1, const double param2) { Index = FUNCTION(param1, param2); file.seekg(index*SIZE_OF_DOUBLE, ios::beg); file.read(reinterpret_cast<char *>(&values), SIZE_OF_DOUBLE); return value ; }
Je pensais aussi stocker le fichier (2Mo) en mémoire pour y accéder encore plus vite (pour éviter de lire sur le disque dur). Cependant, je ne sais pas trop sous quel format/quelles méthodes je dois utiliser car c’est un fichier binaire :
• un istream avec les fonctions seekg et read ?
• un stringsteam (mais il faut convertir les string en double, c’est peut-être pas le plus rapide) ?
• autre format plus performant que je ne connais pas ?
Donc j’aimerais un petit conseil pour optimiser au mieux ce code. Merci d’avance !
Partager