dersblog

C++ Programlarının Performansını Ölçmek

Kodun içinde hangi bloğun ne kadar zaman aldığını ölçmek kodu optimize etmek için gündeme gelir. Altta bir kronometre kodu var, [1]'de görülen bir kronometre objesi yaratmak ve onu başlatıp durdurduktan sonra ne kadar zaman geçtiğini raporlamak.

Bizim yaptığımız ek birden fazla başlatıp durdurabilmek, böylece bir fonksiyon pek çok kez çağrılıyorsa mesela o fonksiyon başında sonunda sürekli başlatıp durdurma sonrası toplam o fonksiyonda ne kadar zaman harcandığını ölçebilmek.

Ya farklı kod bloklarını ölçmek istersek? O zaman alttaki sınıftan her blok için ayrı obje yaratabiliriz böylece o her bloğun zaman kaydı ayrı tutulur.

#include <iostream>
#include <chrono>
#include <ctime>
#include <cmath>

class Timer
{

    double totalElapsed = 0.f;

private:
    std::chrono::time_point<std::chrono::system_clock> m_StartTime;
    std::chrono::time_point<std::chrono::system_clock> m_EndTime;

public:
    void start()
    {
        m_StartTime = std::chrono::system_clock::now();
    }

    void stop()
    {
        m_EndTime = std::chrono::system_clock::now();
    totalElapsed = totalElapsed + std::chrono::duration_cast<std::chrono::milliseconds>(m_EndTime - m_StartTime).count();
    }

    double elapsedMilliseconds()
    {        
        return totalElapsed;
    }

    double elapsedSeconds()
    {
        return elapsedMilliseconds() / 1000.0;
    }

};
#include "cronometer.h"

long fibonacci(unsigned n)
{
    if (n < 2) return n;
    return fibonacci(n-1) + fibonacci(n-2);
}

int main()
{    
    Timer timer;

    // ilk kez baslat
    timer.start();
    for (int i=0;i<100;i++){
    fibonacci(30);
    }
    timer.stop();    
    std::cout << "Milliseconds: " << timer.elapsedMilliseconds() << std::endl;

    // ikinci kez baslat, onceki zamanin ustune eklenmesi lazim
    timer.start();
    for (int i=0;i<100;i++){
    fibonacci(30);
    }
    timer.stop();

    std::cout << "Milliseconds: " << timer.elapsedMilliseconds() << std::endl;
}

Derlemek ve işletmek için,

g++ test.cpp  -o /tmp/run.exe; /tmp/run.exe

Dikkat: Bir fonksiyonun başında start() sonunda stop() koyduğumuz zaman unutmayalım, bu her zaman yeterli olmayabilir, eğer fonksiyonun kodununun ortasında belli bazı şartlarda return ile direk dönüş yapıyorsak, o zaman bu dönüş öncesi de bir stop eklememiz gerekir.

Kaynaklar

[1] https://gist.github.com/mcleary/b0bf4fa88830ff7c882d


Yukarı