c ++ - CPU Udnyttelse Høj

Indlæg af Hanne Mølgaard Plasc

Problem



Vi bruger følgende metode til at skrive logfilen til logfilen. Logposterne gemmes i en vektor, der hedder m\_LogList (stl-string entries gemmes i vektoren). Metoden hedder når størrelsen på vektoren er mere end 100. CPU-udnyttelsen af ​​Log-serveren er omkring 20-40\%, hvis vi kalder FlushLog-metoden. Hvis vi kommenterer FlushLog-metoden, falder CPU-udnyttelsen til 10-20\% interval.

Hvilke optimeringer kan jeg bruge til at reducere CPU-udnyttelsen? Vi bruger fstream-objekt til at skrive logposterne til filen


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           
    }
}

Bedste reference


Den første optimering jeg bruger er at droppe .c\_str() i << m\_LogList[i].c\_str(). Det tvinger operator<< til at gøre en strlen (O (n)) i stedet for at stole på string::size (O (1)).


Også, jeg 'd summere strengstørrelser, i stedet for at ringe tellp.


Endelig indeholder << endl en flush på hver linje. Brug blot << ' '. Du har allerede flush i slutningen.

Andre referencer 1


Jeg dømmer først og fremmest dumping loggen i en stdlib opkald som denne:


std::copy(list.begin(), list.end(), std::ostream\_iterator<std::string>(m\_ofstreamLogFile, "
"));


Dette vil fjerne spylingen på grund af endl og den unødvendige omdannelse til en c-streng. CPU-Wise dette bør være ret effektivt.


Du kan gøre backup efterfølgende, medmindre du virkelig bryr dig om en meget specifik grænse, men selv i så fald siger jeg: backup atsome lavere tærskel, så du kan regne med noget overløb.


Fjern også if(0 < m\_LogList.size()), det er ikke virkelig nødvendigt for noget.

Andre referencer 2


Et par kommentarer:


if(0 < m\_LogList.size())


Burde være:


if(!m\_LogList.empty())


Selv med en vector bør det ikke gøre en forskel.


Også du bør overveje at flytte


m\_nSize = m\_ofstreamLogFile.tellp();
if(m\_pLogMngr->NeedsToBackupFile(m\_nSize)) { /*...*/ }


ud af løkken. Du siger ikke, hvor meget CPU det bruger, men jeg tror det er tungt.


Du kan også iterere ved hjælp af iteratorer:


for (int i = 0; i < (int)m\_LogList.size(); ++i)


Burde være:


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


Endelig ændrer du linjen:


m\_ofstreamLogFile << m\_LogList[i].c\_str()<<endl;


Ind i:


m\_ofstreamLogFile << m\_LogList[i] << '
';


.c\_str() er unødvendigt. Og endl skriver en EOL og flushes strømmen. Du vil ikke gøre det, da du spyler det i slutningen af ​​løkken.