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;

  1. Quando fai cose legate al tempo in C ++, usa std::chrono, not clock().
  2. 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.
  3. Usa include guards per i file di intestazione
    #ifndef LOG_H
    #define LOG_H

    // Code

    #endif
  1. Definisci i costruttori e usali correttamente e sbarazzati di configure.
    Log(std::string fileName, bool printToConsole, bool saveToFile) :
        logFileName(fileName),
        print(printToConsole),
        save(saveToFile)
    {
    }
  1. Non utilizzare trattini bassi per nominare le cose. Le regole generali per c ++ sono nomi di classi sono PascalCase e le funzioni sono camelCase.
  2. std :: cout è lento, considera l'utilizzo di sprintf per renderlo più veloce.
  3. 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.