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;
- Ao fazer coisas relacionadas ao tempo em C ++, use
std::chrono, nãoclock(). - 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.
- Use proteções de inclusão para arquivos de cabeçalho
#ifndef LOG_H
#define LOG_H
// Code
#endif
- Defina construtores, use-os corretamente e livre-se do configure.
Log(std::string fileName, bool printToConsole, bool saveToFile) :
logFileName(fileName),
print(printToConsole),
save(saveToFile)
{
}
- 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.
- std :: cout é lento, considere usar sprintf para torná-lo mais rápido.
- 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.
O que significa um erro “Não é possível encontrar o símbolo” ou “Não é possível resolver o símbolo”?
George Harrison ficou chateado por suas letras de 'Hurdy Gurdy Man' de Donovan não terem sido usadas