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;
- Cuando hagas cosas relacionadas con el tiempo en C ++, usa
std::chrono, notclock(). - 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.
- Use protectores de inclusión para archivos de encabezado
#ifndef LOG_H
#define LOG_H
// Code
#endif
- Defina los constructores y utilícelos correctamente y elimine configure.
Log(std::string fileName, bool printToConsole, bool saveToFile) :
logFileName(fileName),
print(printToConsole),
save(saveToFile)
{
}
- No utilice guiones bajos para nombrar cosas. Las reglas generales para c ++ son nombres de clases PascalCase y funciones camelCase.
- std :: cout es lento, considere usar sprintf para hacerlo más rápido.
- 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.