私は、リアルタイムで実行する必要があるアプリケーションでロギング機能を実装しようとしています(つまり、メインの実行中にファイルに数ミリ秒を費やします低レイテンシを必要とするいくつかのシステムに接続しているため、ループはパフォーマンスに大きな影響を与えます)。私の現在の実装では、ミリ秒ごとにstringstreamオブジェクトにラインをログに記録し、その後にのみ、シャットダウン時にファイルへの結果の文字列を書き込みます。リアルタイムのパフォーマンス要件を持つC++ stlストリングストリームを使用したロギング
class ControlDemo {
public:
ControlDemo();
~ControlDemo();
void spin();
// Other public methods
private:
void logLine(std::vector<double> data);
void writeLogFile();
std::stringstream m_logged_data;
std::string m_log_filename;
bool m_continue_spinning;
// Other private methods
};
ControlDemo::~ControlDemo() {
writeLogFile(); // write log data in RAM to a file
}
void ControlDemo::spin() {
while(m_continue_spinning){
// do stuff
logLine(data_to_log);
sleepRemainingTime(); // maintaining ~1ms loop rate
}
}
void ControlDemo::logLine(std::vector<double> data) {
m_logged_data << getCurrentTime();
for (std::vector<double>::iterator it = data.begin(); it != data.end(); ++it)
m_logged_data << ', ' << *it;
m_logged_data << std::endl;
}
void ControlDemo::writeLogFile() {
std::ofstream file;
file.open(m_log_file_path.c_str());
file << m_logged_data.str();
file.close();
std::cerr << "Wrote log to " << m_log_file_path << std::endl;
}
私の願いは、私は最大数を指定することができるバッファリング機能のいくつかの種類を実装することです私のログの行のうち、最初の行は破棄されます(本質的に循環バッファです)。このようにして、RAMの束を無駄にしたり、データの最後の20秒しか重要でないときに、ログに記録されたデータを蓄積し続けることでアプリケーションの速度を落とすことはありません。
void ControlDemo::logLine(std::vector<double> data) {
static int line_num = 0;
if(line_num < m_max_num_lines)
line_num++;
else // discard first line before inserting next line
m_logged_data.ignore(1000,'\n'); // move get ptr to next line
m_logged_data << getCurrentTime();
for (std::vector<double>::iterator it = data.begin(); it != data.end(); ++it)
m_logged_data << ', ' << *it;
m_logged_data << std::endl;
}
をwriteLogFile()
で呼び出されm_logged_data.str()
は、まだすべてのデータをログに記録返すだけではなく、最後のm_max_num_lines
しかし、ignore()
でポインタを取得にstringstreamを移動することはないことを示唆している:私は次のようにlogLine()
方法を変更することでこれを試みましたstringstreamオブジェクトで使用されるバッファのサイズに影響を与えたり、意図した方法でコードを最適化したりします。
stringstream
クラス(なぜsetBufferSize()
(thisを参照)がないのですか)、または私はロギング機能を管理するために別のものを使用する必要があります。後者の場合は、どのようなクラスを使用すべきかに関する提案はありますか? stringstream
についての素晴らしい点の1つは、私が使用している組み込みの書式設定機能のすべてです(ただし、上のコードスニペットでは示していませんが)。したがって、可能であれば、これらの書式設定機能を維持することは素晴らしいことです。
ようこそスタックオーバーフロー。 [The Tour](http://stackoverflow.com/tour)を読み、[ヘルプセンター](http://stackoverflow.com/help/asking)の資料を参考にしてください。ここに聞いてください。 –
どのようなフォーマット要件がありますか? – EvilTeach
ロギング情報を保持するためにどれくらいのメモリがありますか? – EvilTeach