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;
- Kiedy robi czasowych związanych z rzeczy w C ++, użytkowanie
std::chrono, nieclock(). - 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.
- Użyj osłon włączających dla plików nagłówkowych
#ifndef LOG_H
#define LOG_H
// Code
#endif
- 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)
{
}
- Nie używaj podkreśleń do nazywania rzeczy. Ogólne zasady dla języka c ++ to nazwy klas PascalCase, a funkcje to camelCase.
- std :: cout jest powolny, rozważ użycie sprintf, aby przyspieszyć.
- 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.