Logger semplice in C ++
Oct 21 2020
Attualmente sto realizzando un gioco utilizzando C ++ . Alla fine ho avuto bisogno di un logger, ma non ero soddisfatto di nessuna delle soluzioni esistenti. Dopo un po ', ho scritto la mia intestazione chiamata 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: ");
}
};
La mia libreria può stampare l'ora corrente e altre informazioni sulla console e salvare questi dati in un file. Ma ho fatto un paio di benchmark e si è scoperto che il mio programma di registrazione è molto più lento rispetto al normale std :: cout .
Poiché la velocità è fondamentale per i giochi, volevo chiedere se ci sono modi per ottimizzare il mio programma o, se necessario, per migliorarlo.
Risposte
3 mkamerath Oct 21 2020 at 04:49
Alcune cose da notare;
- Quando fai cose legate al tempo in C ++, usa
std::chrono, notclock(). - Il registro non funzionerà se viene utilizzato in più file. Invece di essere in un file .h, metti la definizione del logger in un file cpp e crea entrambi insieme.
- Usa include guards per i file di intestazione
#ifndef LOG_H
#define LOG_H
// Code
#endif
- Definisci i costruttori e usali correttamente e sbarazzati di configure.
Log(std::string fileName, bool printToConsole, bool saveToFile) :
logFileName(fileName),
print(printToConsole),
save(saveToFile)
{
}
- Non utilizzare trattini bassi per nominare le cose. Le regole generali per c ++ sono nomi di classi sono PascalCase e le funzioni sono camelCase.
- std :: cout è lento, considera l'utilizzo di sprintf per renderlo più veloce.
- Non scrivere su un file ogni volta che chiami log. L'apertura di file e la scrittura su di essi è lenta. Considera l'idea di scrivere nel file con un timestamp o di aggregare alcuni log prima di scriverli.