Logger simples em C ++

Oct 21 2020

Atualmente, estou fazendo um jogo usando C ++ . Acabei por precisar de um logger, mas não estava satisfeito com nenhuma das soluções existentes. Depois de um tempo, escrevi meu próprio cabeçalho chamado 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: ");
        }
};

Minha biblioteca pode imprimir a hora atual e outras informações no console e salvar esses dados em um arquivo. Mas eu fiz alguns benchmarks e descobri que meu programa de registro é muito mais lento em comparação com o std :: cout normal .

Como a velocidade é crucial para jogos, gostaria de perguntar se há maneiras de otimizar meu programa ou, se necessário, melhorá-lo.

Respostas

3 mkamerath Oct 21 2020 at 04:49

Algumas coisas a serem observadas;

  1. Ao fazer coisas relacionadas ao tempo em C ++, use std::chrono, não clock().
  2. Seu log não funcionará se for usado em vários arquivos. Em vez de estar em um arquivo .h, coloque a definição do logger em um arquivo cpp e construa os dois juntos.
  3. Use proteções de inclusão para arquivos de cabeçalho
    #ifndef LOG_H
    #define LOG_H

    // Code

    #endif
  1. Defina construtores, use-os corretamente e livre-se do configure.
    Log(std::string fileName, bool printToConsole, bool saveToFile) :
        logFileName(fileName),
        print(printToConsole),
        save(saveToFile)
    {
    }
  1. Não use sublinhados para nomear coisas. As regras gerais para c ++ são nomes de classe são PascalCase e funções são camelCase.
  2. std :: cout é lento, considere usar sprintf para torná-lo mais rápido.
  3. Não escreva em um arquivo toda vez que você chamar o log. Abrir arquivos e gravar neles é lento. Considere gravar no arquivo em um carimbo de data / hora ou agregar alguns logs antes de gravá-los.