C ++ 'da Basit Kaydedici
Oct 21 2020
Şu anda C ++ kullanarak bir oyun yapıyorum . Sonunda bir kaydediciye ihtiyacım vardı, ancak mevcut çözümlerin hiçbirinden memnun değildim. Bir süre sonra log.h adlı kendi başlığımı yazdım :
#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: ");
}
};
Kitaplığım geçerli saati ve diğer bilgileri konsola yazdırabilir ve bu verileri bir dosyaya kaydedebilir. Ama birkaç test yaptım ve günlüğe kaydetme programımın normal std :: cout ile karşılaştırıldığında çok daha yavaş olduğu ortaya çıktı .
Oyunlar için hız çok önemli olduğundan, programımı optimize etmenin veya gerekirse geliştirmenin yolları olup olmadığını sormak istedim.
Yanıtlar
3 mkamerath Oct 21 2020 at 04:49
Dikkat edilmesi gereken bazı noktalar;
- C ++ 'da zamanla ilgili şeyler yaparken kullanmayın
std::chrono, değilclock(). - Günlüğünüz birden çok dosyada kullanılırsa çalışmayacaktır. Bir .h dosyasında olmak yerine, günlükçünün tanımını bir cpp dosyasına koyun ve ikisini birlikte oluşturun.
- Başlık dosyaları için dahil etme korumalarını kullanın
#ifndef LOG_H
#define LOG_H
// Code
#endif
- Oluşturucuları tanımlayın ve bunları doğru şekilde kullanın ve yapılandırmadan kurtulun.
Log(std::string fileName, bool printToConsole, bool saveToFile) :
logFileName(fileName),
print(printToConsole),
save(saveToFile)
{
}
- Nesneleri adlandırmak için alt çizgi kullanmayın. C ++ için genel kurallar, sınıf isimleri PascalCase ve işlevler camelCase'dir.
- std :: cout yavaştır, daha hızlı hale getirmek için sprintf kullanmayı düşünün.
- Günlüğü her çağırdığınızda bir dosyaya yazmayın. Dosyaları açmak ve bunlara yazmak yavaş. Dosyaya bir zaman damgası ile yazmayı veya yazmadan önce birkaç günlüğü toplamayı düşünün.
Donovan, Şarkılarından 1'ini The Beatles'ın "Lucy in the Sky with Diamonds" şarkısıyla karşılaştırdı
Kevin Jonas'ın Kızı Alena, Doğum Günü Fotoğrafında Büyümüş Görünüyor: '9 Yaşında Gerçek Hissetmiyor'
Charly Reynolds Yakın Zamandaki Vokal Kord Ameliyatını Açıkladı: 'Şarkı Söylemekte Sorun Yaşıyordum'