2012-03-29 23 views
1

次の方法を使用してログをログファイルに書き込みます。ログエントリは、m_LogListという名前のベクトルに保持されます(stl文字列エントリはベクトルに保持されます)。このメソッドは、ベクトルのサイズが100を超えると呼び出されます.FlushLogメソッドを呼び出すと、LogサーバーのCPU使用率は約20-40%になります。 FlushLogメソッドをコメントアウトすると、CPU使用率は10〜20%の範囲に低下します。
CPU使用率を下げるためにどのような最適化を使用できますか?私たちは、私が使用したい最初の最適化が<< m_LogList[i].c_str().c_str()をドロップすることですCPU使用率が高い

void CLogFileWriter::FlushLog() 
{ 
    CRCCriticalSectionLock lock(m_pFileCriticalSection); 
    //Entire content of the vector are writing to the file 
    if(0 < m_LogList.size()) 
    {  
     for (int i = 0; i < (int)m_LogList.size(); ++i) 
     { 
      m_ofstreamLogFile << m_LogList[i].c_str()<<endl; 
      m_nSize = m_ofstreamLogFile.tellp(); 

      if(m_pLogMngr->NeedsToBackupFile(m_nSize)) 
      { 
         // Backup the log file 
      } 
     } 

     m_ofstreamLogFile.flush(); 
     m_LogList.clear(); //Clearing the content of the Log List   
    } 
} 
+0

ベクトル "list"を呼び出すのは少し誤解を招くことです。 – MSalters

+0

CPU使用率がこれ以上上昇する場合は、マシンが限られているか、FlushLogをかなり頻繁に呼び出す必要がありますか?クリティカルセクションを作成するのは非常に面倒ですが、私はそれが必要であると想定しています。 – Rolle

答えて

3

をファイルにログエントリを書き込むためのfstreamオブジェクトを使用しています。 string::size(O(1))に頼る代わりにoperator<<strlen(O(n))を実行させます。

また、tellpを呼び出す代わりに、文字列のサイズを合計します。

最後に、<< endlには、すべての行にフラッシュが含まれています。ちょうど<< '\n'を使用してください。あなたはすでに最後にフラッシュがあります。

3

私はこのような1回のSTDLIBコールでログをダンプまず検討したい:

std::copy(list.begin(), list.end(), std::ostream_iterator<std::string>(m_ofstreamLogFile, "\n")); 

これはENDLとCの文字列に変換不要のフラッシュを削除します。これは非常に効率的でなければなりません。

あなたは非常に特定の制限を本当に気にしない限り、後でバックアップを行うことができますが、その場合でも私はいくつかのオーバーフローを考慮に入れることができます。

また、if(0 < m_LogList.size())を削除してください。これは実際には必要ありません。

0

いくつかのコメント:

if(0 < m_LogList.size()) 

は次のようになります。

if(!m_LogList.empty()) 

vectorでそれが違いを作るべきではありませんが。

また、あなたは蚊帳の外

m_nSize = m_ofstreamLogFile.tellp(); 
if(m_pLogMngr->NeedsToBackupFile(m_nSize)) { /*...*/ } 

を移動することを検討すべきです。どれくらいのCP​​Uを使っているのかは分かりませんが、重いと思います。

あなたはイテレータを使用しても反復することができます:

for (int i = 0; i < (int)m_LogList.size(); ++i) 

は次のようになります。

for (std::vector<std::string>::iterator it = m_LogList.begin(); 
    it != m_LogList.end(); ++it) 

最後に、行変更:中に、

m_ofstreamLogFile << m_LogList[i].c_str()<<endl; 

を:

m_ofstreamLogFile << m_LogList[i] << '\n'; 

.c_str()は不要です。endlはEOLを書き込み、はストリームをフラッシュします。ループの終わりにそれを洗い流しているので、あなたはそれをしたくありません。

関連する問題