2016-12-10 84 views
7

C++ 'da yeni ve kütüphanesi hakkında pek bir şey bilmiyorum. Ben milisaniye şimdiki zaman elde etmek için hangi farklı sıralama algoritmaları, zaman analizi yapmak gerekir. Bunu yapmanın bir yolu var mı?Geçerli saati milisaniye cinsinden nasıl alabilirim?

+1

göz :: chorno – DanielCollier

+0

algoritmaları sıralama analizi için, milisaniye yeterince düşük çözünürlük ve "şimdiki zaman" değil mi' olmayabilir t gerçekten neye ihtiyacın var. Bir görevi yerine getirmek için göreceli bir zaman istersiniz. std :: chrono :: high_resolution_clock' muhtemelen istediğiniz şeydir. – Chad

+0

Teşekkürler gsamaras için çözüm, sadece küçük şüphe, yorumlarda yukarıda birisi olarak göreceli bir zaman olduğunu belirtti, java şu anki saat 1sr Ocak 1970 den hesaplanır, bu yüzden high_resolution_clock :: now() işlevi zamana göre döndürür hangi zaman? –

cevap

12

Yalnızca std::chrono'u kullanın. kez "1000 yıldızlı baskı" görevi feryat genel örnek:

#include <iostream> 
#include <ctime> 
#include <ratio> 
#include <chrono> 

int main() 
{ 
    using namespace std::chrono; 

    high_resolution_clock::time_point t1 = high_resolution_clock::now(); 

    std::cout << "printing out 1000 stars...\n"; 
    for (int i=0; i<1000; ++i) std::cout << "*"; 
    std::cout << std::endl; 

    high_resolution_clock::time_point t2 = high_resolution_clock::now(); 

    duration<double, std::milli> time_span = t2 - t1; 

    std::cout << "It took me " << time_span.count() << " milliseconds."; 
    std::cout << std::endl; 

    return 0; 
} 

yerine yıldızlı baskı, oradaki sıralama algoritması yerleştirecektir ve zaman bunu ölçmek.


, ör bazı kıyaslama yapmak niyetinde ise, derleyici optimizasyon bayrakları etkinleştirmek unutmayın için -O3 gerekir. Why emplace_back is faster than push_back?


Ps: senin derleyici sonra benim Time Measurements (C++) diğer yöntemlerle içine bakmak olabilir, desteklemiyorsa Bu ciddi, öyle yapmadım zaman bana ne olduğunu kontrol edin.

#include <iostream> 
#include <ctime> 
#include <ratio> 
#include <chrono> 

void quickSort(int a[], int first, int last); 
int pivot(int a[], int first, int last); 
void swap(int& a, int& b); 
void swapNoTemp(int& a, int& b); 

using namespace std; 
using namespace std::chrono; 

int main() 
{ 
    int test[] = { 7, -13, 1, 3, 10, 5, 2, 4 }; 
    int N = sizeof(test)/sizeof(int); 

    cout << "Size of test array :" << N << endl; 

    high_resolution_clock::time_point t1 = high_resolution_clock::now(); 

    // I want to measure quicksort 
    quickSort(test, 0, N-1); 

    high_resolution_clock::time_point t2 = high_resolution_clock::now(); 

    duration<double> time_span = t2 - t1; 

    std::cout << "It took me " << time_span.count() << " seconds."; 
    std::cout << std::endl; 

    return 0; 
} 

ve çıkış şimdi:


spesifik (oyuncak) örneği kullanarak benim Quicksort (C++) olurdu

Georgioss-MacBook-Pro:~ gsamaras$ g++ -Wall -std=c++11 -O3 main.cpp 
Georgioss-MacBook-Pro:~ gsamaras$ ./a.out 
Size of test array :8 
It took me 3.58e-07 seconds. 

Bu kadar basit. Mutlu kıyaslama! =)


DÜZENLEME:

high_resolution_clock::now() fonksiyonu olan bir süre için zaman göreceli olarak döner? std::chrono itibaren

:

Zaman

sonraki tren geçer kişinin doğum günü, bugünün şafak veya zaman gibi zaman içinde belirli bir noktada yapılan bir başvuru, işaret ediyor. Bu kitaplığında, time_point sınıf şablonunun nesneleri, epoch (aynı saat kullanılarak tüm time_point nesnelerinin ortak olduğu zaman zamanında sabit bir noktadır) kullanarak bir süreyi kullanarak bunu ile ifade eder. bir çıkışı bu epoch and time_point example, kontrol edebilir

: std içine

time_point tp is: Thu Jan 01 01:00:01 1970 
+1

Çözüm için teşekkürler gsamaras. –

+2

İlk satır kodunuzu, herhangi bir açık döküm olmaksızın çift milisaniye olarak atayarak basitleştirebilirsiniz: 'duration time_span = t2 - t1;'. Ve sonra bunu manuel olarak milisaniye dönüşmeden yazdırabilirsiniz: '<< time_span.count() <<" milisaniye. "'. Ayrıca ikinci örneğinizde "duration_cast" ifadesini de bırakabilirsiniz. Daha güvenilir 'chrono' kodu yazmak için diğer ipuçları burada: https://www.youtube.com/watch?v=P32hvk8b13M –

+0

@HowardHinnant Yorumunuz ve videonuzda havalı ipuçları! Teşekkür ederim. Cevabımı güncelledim, şimdi beğeneceğinizi umuyoruz. =) – gsamaras