Einfacher Logger in C ++
Oct 21 2020
Ich mache gerade ein Spiel mit C ++ . Ich brauchte schließlich einen Logger, war aber mit keiner der vorhandenen Lösungen zufrieden. Nach einer Weile schrieb ich meinen eigenen Header namens 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: ");
}
};
Meine Bibliothek kann die aktuelle Uhrzeit sowie andere Informationen auf der Konsole drucken und diese Daten in einer Datei speichern. Aber ich habe ein paar Benchmarks durchgeführt und es stellt sich heraus, dass mein Protokollierungsprogramm im Vergleich zum normalen std :: cout viel langsamer ist .
Da Geschwindigkeit für Spiele entscheidend ist, wollte ich fragen, ob es Möglichkeiten gibt, mein Programm zu optimieren oder gegebenenfalls zu verbessern.
Antworten
3 mkamerath Oct 21 2020 at 04:49
Einige Dinge zu beachten;
- Verwenden Sie
std::chrononicht , wenn Sie zeitbezogene Dinge in C ++ ausführenclock(). - Ihr Protokoll funktioniert nicht, wenn es in mehreren Dateien verwendet wird. Anstatt sich in einer .h-Datei zu befinden, fügen Sie die Definition des Loggers in eine cpp-Datei ein und erstellen Sie beide zusammen.
- Verwenden Sie Include Guards für Header-Dateien
#ifndef LOG_H
#define LOG_H
// Code
#endif
- Definieren Sie Konstruktoren, verwenden Sie sie ordnungsgemäß und entfernen Sie configure.
Log(std::string fileName, bool printToConsole, bool saveToFile) :
logFileName(fileName),
print(printToConsole),
save(saveToFile)
{
}
- Verwenden Sie keine Unterstriche zum Benennen von Dingen. Allgemeine Regeln für c ++ sind Klassennamen sind PascalCase und Funktionen sind camelCase.
- std :: cout ist langsam. Verwenden Sie sprintf, um es schneller zu machen.
- Schreiben Sie nicht jedes Mal in eine Datei, wenn Sie log aufrufen. Das Öffnen und Schreiben von Dateien ist langsam. Überlegen Sie, ob Sie mit einem Zeitstempel in die Datei schreiben oder einige Protokolle zusammenfassen möchten, bevor Sie sie schreiben.