Logger simple en C ++
Oct 21 2020
Je crée actuellement un jeu en C ++ . J'ai finalement eu besoin d'un enregistreur, mais je n'étais satisfait d'aucune des solutions existantes. Après un certain temps, j'ai écrit mon propre en-tête appelé log.h :
#include <iostream>
#include <iomanip>
#include <string>
#include <ctime>
#include <fstream>
#include <sstream>
class Logger {
private:
std::string logFileName = "log.txt";
bool print = true;
bool save = true;
void log(std::string s, std::string i) {
time_t cuT;
struct tm *loT;
time(&cuT);
loT = localtime(&cuT);
std::stringstream ss;
ss << std::setw(2) << std::setfill('0') << loT->tm_hour << ':';
ss << std::setw(2) << std::setfill('0') << loT->tm_min << ':';
ss << std::setw(2) << std::setfill('0') << loT->tm_sec;
ss << i << s << "\n";
if(save) {
std::ofstream of;
of.open(logFileName, std::ios_base::app | std::ios::out);
of << ss.rdbuf();
}
if(print) {
std::cout << ss.str();
}
}
public:
void configure(std::string logFileName_, bool print_, bool save_) {
this->print = print_;
this->save = save_;
this->logFileName = logFileName_;
}
void note(std::string s) {
log(s, " NOTE: ");
}
void error(std::string s) {
log(s, " ERROR: ");
}
void warn(std::string s) {
log(s, " WARNING: ");
}
};
Ma bibliothèque peut imprimer l'heure actuelle ainsi que d'autres informations sur la console et enregistrer ces données dans un fichier. Mais j'ai fait quelques tests et il s'est avéré que mon programme de journalisation est beaucoup plus lent que le std :: cout normal .
Puisque la vitesse est cruciale pour les jeux, je voulais demander s'il existe des moyens d'optimiser mon programme ou, si nécessaire, de l'améliorer.
Réponses
3 mkamerath Oct 21 2020 at 04:49
Quelques choses à noter;
- Lorsque vous faites des choses liées au temps en C ++, utilisez
std::chrono, pasclock(). - Votre journal ne fonctionnera pas s'il est utilisé dans plusieurs fichiers. Au lieu d'être dans un fichier .h, mettez la définition de l'enregistreur dans un fichier cpp et construisez les deux ensemble.
- Utiliser des gardes d'inclusion pour les fichiers d'en-tête
#ifndef LOG_H
#define LOG_H
// Code
#endif
- Définissez les constructeurs et utilisez-les correctement et débarrassez-vous de configure.
Log(std::string fileName, bool printToConsole, bool saveToFile) :
logFileName(fileName),
print(printToConsole),
save(saveToFile)
{
}
- N'utilisez pas de traits de soulignement pour nommer des choses. Les règles générales pour c ++ sont les noms de classe sont PascalCase et les fonctions sont camelCase.
- std :: cout est lent, pensez à utiliser sprintf pour le rendre plus rapide.
- N'écrivez pas dans un fichier à chaque fois que vous appelez le journal. L'ouverture des fichiers et leur écriture sont lentes. Pensez à écrire dans le fichier sur un horodatage ou à agréger quelques journaux avant de les écrire.