非常に詳細なログを生成する必要がある小さなアプリを使用しています。このような単純なシングルトンロガークラスを実装しました
#ifndef LOGGER_H
#define LOGGER_H
#include <QObject>
#include <QMutex>
#include <QFile>
class Logger : public QObject
{
Q_OBJECT
public:
static Logger* sharedInstance()
{
static QMutex mutex;
if (!m_sharedInstance)
{
mutex.lock();
if(!m_sharedInstance)
m_sharedInstance = new Logger;
mutex.unlock();
}
return m_sharedInstance;
}
static void dropInstance()
{
static QMutex mutex;
mutex.lock();
delete m_sharedInstance;
m_sharedInstance = 0;
mutex.unlock();
}
void setLogFilePathAndOpen(QString path);
void logMessage(QString message);
void logMessageWorker(QString message);
void closeLog();
private:
Logger() {}
Logger(const Logger &);
Logger& operator=(const Logger &);
static Logger *m_sharedInstance;
QFile m_logFile;
signals:
public slots:
};
#endif // LOGGER_H
#include <QDateTime>
#include <QtConcurrentRun>
#include "logger.h"
Logger* Logger::m_sharedInstance = 0;
void Logger::setLogFilePathAndOpen(QString path)
{
m_logFile.setFileName(path);
m_logFile.open(QIODevice::Append | QIODevice::Text);
}
void Logger::logMessage(QString message)
{
//TODO calling QtConcurrent causes about a 22% drop in performance. Look at other ways to do this.
QtConcurrent::run(this, &Logger::logMessageWorker, message);
}
void Logger::logMessageWorker(QString message)
{
QTextStream out(&m_logFile);
out << tr("%1: %2\n").arg(QDateTime::currentDateTime().toString()).arg(message);
}
void Logger::closeLog()
{
m_logFile.close();
}
今、私はQtとC ++に少し慣れていませんが、おそらくこれはすべて間違っているので、気楽に行ってください:)。この方法を使用すると、ログに記録しない場合と比較して、パフォーマンスが約22%低下します。これは、これまで管理できた中で最高の方法です。パフォーマンスの低下は、QtConcurrentスレッドの作成によるものだと思います。
私の質問は、これが最善のアプローチなのか、それともまったくログに記録しないよりもパフォーマンスがさらに向上する、これを実装するためのより良い方法があるのかということだと思います。アプリケーションのロギングが遅くなることは承知していますが、これを可能な限り最小限に抑えようとしています。