C ++ 'da clock () nasıl kullanılır


127

Nasıl diyorsunuz clock()içinde C++?

Örneğin, bir dizideki belirli bir öğeyi bulmak için doğrusal bir aramanın ne kadar zaman aldığını test etmek istiyorum.


1
Duvar saati zamanının her zaman mikro ölçütleri ölçmek için iyi bir yol olmadığını unutmayın. Tutarlı sonuçlar elde etmek için CPU frekansı ölçeklendirmesi etrafında çalışmanız gerekir ( termal / güç limitleri izin verdiğinde CPU saatinizin daha yüksek olmasını sağlayan Intel turbo veya AMD eşdeğeri dahil ). Performans sayaçlarıyla profil oluşturma, size çekirdek saat döngülerinde ölçümler verebilir (ve ayrıca bir darboğazın önbellekte eksikler mi, talimat verimi mi yoksa gecikme mi olduğu hakkında ayrıntılar, yalnızca döngülerin dışındaki sayaçlara bakarak) sağlayabilir. Linux'ta,perf stat -d ./a.out
Peter Cordes

Yanıtlar:


206
#include <iostream>
#include <cstdio>
#include <ctime>

int main() {
    std::clock_t start;
    double duration;

    start = std::clock();

    /* Your algorithm here */

    duration = ( std::clock() - start ) / (double) CLOCKS_PER_SEC;

    std::cout<<"printf: "<< duration <<'\n';
}

5
Burada gördüğüm kadarıyla cplusplus.com/reference/ctime/clock , "std ::" gösterimini kullanmanıza gerek yok. Sadece "clock ()" kullanın
gromit190

4
@Birger: Çalıştığım tüm projelerde, kod stili her std :: call'dan önce std :: gerektirir.
Th. Thielemann

2
Bu saniyeler içinde yanıtı verir mi?
Arnav Borborah

1
@ArnavBorborah Evet, öyle.
QuantumHoneybees

1
@ Th.Thielemann hem clock()ve clock_tC Standart Kütüphane başlığından vardır time.hve bu nedenle kullanımını gerekmez std, kitaplıklarına dahil edilmesinden sonra önekleri. <ctime>bu değeri ve işlevi stdad alanıyla sarar , ancak kullanılması zorunlu değildir. Uygulama ayrıntıları için burayı kontrol edin: en.cppreference.com/w/cpp/header/ctime
kayleeFrye_onDeck

70

Taşınabilir ve daha yüksek hassasiyete sahip, C ++ 11'den beri mevcut olan alternatif bir çözüm kullanmaktır std::chrono.

İşte bir örnek:

#include <iostream>
#include <chrono>
typedef std::chrono::high_resolution_clock Clock;

int main()
{
    auto t1 = Clock::now();
    auto t2 = Clock::now();
    std::cout << "Delta t2-t1: " 
              << std::chrono::duration_cast<std::chrono::nanoseconds>(t2 - t1).count()
              << " nanoseconds" << std::endl;
}

Bunu ideone.com'da çalıştırmak bana şunu verdi:

Delta t2-t1: 282 nanoseconds

11
C ++ 11'i kullanmayı öneriyorsanız, yazabilirsiniz using Clock=std::chrono::high_resolution_clock;. Tür takma adına bakın .
JHBonarius

std::chrono::high_resolution_clocktüm std lib uygulamalarında monoton değildir. Cppreference'den - Genellikle, doğrudan std :: chrono :: high_resolution_clock yerine std :: chrono :: steady_clock veya std :: chrono :: system_clock kullanılmalıdır: süre ölçümleri için steady_clock ve duvar saati süresi için system_clock kullanın.
Kristianmitk

30

clock()programınız başladığından beri saat tıklama sayısını döndürür. CLOCKS_PER_SECBir saniyede kaç saat tıklaması olduğunu söyleyen ilgili bir sabit vardır . Böylece herhangi bir işlemi şu şekilde test edebilirsiniz:

clock_t startTime = clock();
doSomeOperation();
clock_t endTime = clock();
clock_t clockTicksTaken = endTime - startTime;
double timeInSeconds = clockTicksTaken / (double) CLOCKS_PER_SEC;

6
timeInSecondsher zaman 0.000000benim için geliyor. Nasıl düzeltirim?
noufal

3
@noufal Belki harcanan zaman o kadar kısadır ki 0 olarak görünür long double. Daha fazla hassasiyet elde etmek için a kullanmayı deneyebilirsiniz .
Gerard

muhtemelen saat çözünürlüğünüz yeterince yüksek değil, bu yüzden zaman geçmedi.
Marco Freudenberger

4

En azından Windows'ta, pratik olarak doğru olan tek ölçüm mekanizması QueryPerformanceCounter'dır (QPC). std :: chrono onu kullanarak gerçeklenir (VS2015'ten beri, eğer bunu kullanırsanız), ancak QueryPerformanceCounter'ı doğrudan kullanmakla aynı derecede doğru değildir . Özellikle, 1 nanosaniye taneciklikte rapor edilmesi iddiası kesinlikle doğru değildir. Dolayısıyla, çok kısa bir süre alan bir şeyi ölçüyorsanız (ve durumunuz böyle bir durum olabilir), o zaman işletim sisteminiz için QPC veya eşdeğerini kullanmalısınız. Önbellek gecikmelerini ölçerken bununla karşılaştım ve burada yararlı bulabileceğiniz bazı notlar aldım; https://github.com/jarlostensen/notesandcomments/blob/master/stdchronovsqcp.md


0
#include <iostream>
#include <ctime>
#include <cstdlib> //_sleep()  --- just a function that waits a certain amount of milliseconds

using namespace std;

int main()
{

    clock_t cl;     //initializing a clock type

    cl = clock();   //starting time of clock

    _sleep(5167);   //insert code here

    cl = clock() - cl;  //end point of clock

    _sleep(1000);   //testing to see if it actually stops at the end point

    cout << cl/(double)CLOCKS_PER_SEC << endl;  //prints the determined ticks per second (seconds passed)


    return 0;
}

//outputs "5.17"

Bu, önceden cevaplanmış soruya eklenmez. Cl = clock () - cl'den sonra uykuya gerek yoktur. Ve cout saniye basar, saniyede tik değil. cl, saat işaretlerini saklar.
Dr Yunke

0

Muhtemelen bunun gibi bir zamanlayıcıyla ilgilenebilirsiniz: H: M: S. Msn.

Linux işletim sistemindeki kod:

#include <iostream>
#include <unistd.h>

using namespace std;
void newline(); 

int main() {

int msec = 0;
int sec = 0;
int min = 0;
int hr = 0;


//cout << "Press any key to start:";
//char start = _gtech();

for (;;)
{
        newline();
                if(msec == 1000)
                {
                        ++sec;
                        msec = 0;
                }
                if(sec == 60)
                {
                        ++min;
                        sec = 0; 
                }
                if(min == 60)
                {
                        ++hr;
                        min = 0;
                }
        cout << hr << " : " << min << " : " << sec << " . " << msec << endl;
        ++msec;
        usleep(100000); 

}

    return 0;
}

void newline()
{
        cout << "\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n";
}

İlk koşulu kontrol etmek isteyebilirsiniz ... 10 msn = 1 sn?
Dr Yunke

2
Bu, zaman içinde göreceli hata biriktirir çünkü yazdırmak için gereken süreyi dahil etmezsiniz ve usleepher zaman tam olarak istediğiniz miktardan sonra geri gelmez. Bazen daha uzun olacaktır. Başlangıçta şimdiki zamanı kontrol etmeli, ardından o anki zamanı kontrol etmeli ve döngü boyunca her başladığınızdan beri mutlak zamanı elde etmek için çıkarmalısınız.
Peter Cordes

0

programınızın ne kadar süre çalıştığını ölçebilirsiniz. Aşağıdaki işlevler, programın başlangıcından bu yana CPU zamanını ölçmeye yardımcı olur:

  • C ++ (çift) saat () / ctime dahil SANİYE BAŞINA SAAT.
  • python time.clock (), saniye cinsinden kayan nokta değerini döndürür.
  • Java System.nanoTime (), nanosaniye cinsinden uzun değer döndürür.

referansım : Algorithms toolbox 1. hafta dersi veri yapıları ve algoritmalar uzmanlığı, California Üniversitesi, San Diego ve National Research University Higher School of Economics tarafından

böylece bu kod satırını algoritmanızdan sonra ekleyebilirsiniz.

cout << (double)clock() / CLOCKS_PER_SEC ;

Beklenen Çıktı: sayısını temsil eden çıktı clock ticks per second


1
Soru yalnızca c ++ istemektir. Bu nedenle, diğer programlama dillerine / komut dosyalarına başvurmanız güzel, ancak konu dışı.
dboy
Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.