Registrador simple en C ++

Oct 21 2020

Actualmente estoy haciendo un juego usando C ++ . Eventualmente necesité un registrador, pero no estaba satisfecho con ninguna de las soluciones existentes. Después de un tiempo, escribí mi propio encabezado llamado 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: ");
        }
};

Mi biblioteca puede imprimir la hora actual y otra información en la consola y guardar estos datos en un archivo. Pero hice un par de evaluaciones comparativas y resulta que mi programa de registro es mucho más lento en comparación con el estándar std :: cout .

Dado que la velocidad es crucial para los juegos, quería preguntar si hay formas de optimizar mi programa o, si es necesario, de mejorarlo.

Respuestas

3 mkamerath Oct 21 2020 at 04:49

Algunas cosas a tener en cuenta;

  1. Cuando hagas cosas relacionadas con el tiempo en C ++, usa std::chrono, not clock().
  2. Su registro no funcionará si se usa en varios archivos. En lugar de estar en un archivo .h, ponga la definición del registrador en un archivo cpp y compile ambos juntos.
  3. Use protectores de inclusión para archivos de encabezado
    #ifndef LOG_H
    #define LOG_H

    // Code

    #endif
  1. Defina los constructores y utilícelos correctamente y elimine configure.
    Log(std::string fileName, bool printToConsole, bool saveToFile) :
        logFileName(fileName),
        print(printToConsole),
        save(saveToFile)
    {
    }
  1. No utilice guiones bajos para nombrar cosas. Las reglas generales para c ++ son nombres de clases PascalCase y funciones camelCase.
  2. std :: cout es lento, considere usar sprintf para hacerlo más rápido.
  3. No escriba en un archivo cada vez que llame al registro. Abrir archivos y escribir en ellos es lento. Considere escribir en el archivo en una marca de tiempo o agregar algunos registros antes de escribirlos.