Prosty Logger w C ++

Oct 21 2020

Obecnie tworzę grę w C ++ . Ostatecznie potrzebowałem rejestratora, ale żadne z istniejących rozwiązań nie było satysfakcjonujące. Po chwili napisałem własny nagłówek o nazwie 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: ");
        }
};

Moja biblioteka może wydrukować aktualny czas oraz inne informacje na konsoli i zapisać te dane do pliku. Ale zrobiłem kilka testów porównawczych i okazuje się, że mój program do logowania jest dużo wolniejszy w porównaniu do normalnego std :: cout .

Ponieważ prędkość ma kluczowe znaczenie dla gier, chciałem zapytać, czy są sposoby na optymalizację mojego programu lub, jeśli to konieczne, na jego ulepszenie.

Odpowiedzi

3 mkamerath Oct 21 2020 at 04:49

Kilka rzeczy do zapamiętania;

  1. Kiedy robi czasowych związanych z rzeczy w C ++, użytkowanie std::chrono, nie clock().
  2. Twój dziennik nie będzie działał, jeśli będzie używany w wielu plikach. Zamiast znajdować się w pliku .h, umieść definicję programu rejestrującego w pliku cpp i skompiluj oba razem.
  3. Użyj osłon włączających dla plików nagłówkowych
    #ifndef LOG_H
    #define LOG_H

    // Code

    #endif
  1. Zdefiniuj konstruktory i używaj ich poprawnie i pozbądź się konfiguracji.
    Log(std::string fileName, bool printToConsole, bool saveToFile) :
        logFileName(fileName),
        print(printToConsole),
        save(saveToFile)
    {
    }
  1. Nie używaj podkreśleń do nazywania rzeczy. Ogólne zasady dla języka c ++ to nazwy klas PascalCase, a funkcje to camelCase.
  2. std :: cout jest powolny, rozważ użycie sprintf, aby przyspieszyć.
  3. Nie zapisuj do pliku za każdym razem, gdy dzwonisz do dziennika. Otwieranie plików i zapisywanie do nich jest powolne. Rozważ zapisanie do pliku znacznika czasu lub zagregowanie kilku dzienników przed ich zapisaniem.