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

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);}
}
• Mon main

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);
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).

• 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);
 
#endif
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
}
Le 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).

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);
 
#endif
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 ;
}
C’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().

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 !