2012-03-29 182 views
1

我们使用以下方法将日志写入日志文件。日志条目保存在一个名为m_LogList的向量中(stl字符串条目保存在向量中)。当矢量的大小超过100时调用该方法。如果我们调用FlushLog方法,Log服务器的CPU利用率大约为20-40%。如果我们注释掉FlushLog方法,CPU利用率会下降到10-20%的范围。
我可以使用哪些优化来降低CPU利用率?我们使用fstream的对象写日志记录到文件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

调用矢量“列表”有点令人误解。 – MSalters 2012-03-29 12:32:04

+0

如果你的CPU利用率增加了这么多,你必须有一台有限的机器,或者你经常调用FlushLog?制作关键部分相当昂贵,但我认为这是您需要的。 – Rolle 2012-03-29 12:40:34

回答

3

我会用第一种优化是删除.c_str()<< m_LogList[i].c_str()。它强制operator<<做一个strlen(O(n)),而不是依靠string::size(O(1))。

此外,我只是总结字符串大小,而不是调用tellp

最后,<< endl在每一行包括一个刷新。只需使用<< '\n'。你已经有了冲洗结束。

3

我会考虑首先在一个STDLIB通话倾销日志是这样的:

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

这将消除因ENDL和不必要的转换至C字符串的冲洗。 CPU方面,这应该是非常有效的。

你可以事后做备份,除非你真的关心一个非常具体的限制,但即使在这种情况下,我会说:备份在一些较低的阈值,以便你可以解释一些溢出。

此外,删除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)) { /*...*/ } 

圈外。你不会说它使用了多少CPU,但我敢打赌它很重。

你也可以使用重复迭代器:

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和刷新这个流。你不想这样做,因为你在循环结束时正在冲洗它。