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.
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.
Yanıtlar:
#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';
}
clock()
ve clock_t
C Standart Kütüphane başlığından vardır time.h
ve bu nedenle kullanımını gerekmez std
, kitaplıklarına dahil edilmesinden sonra önekleri. <ctime>
bu değeri ve işlevi std
ad 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
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
using Clock=std::chrono::high_resolution_clock;
. Tür takma adına bakın .
std::chrono::high_resolution_clock
tü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.
clock()
programınız başladığından beri saat tıklama sayısını döndürür. CLOCKS_PER_SEC
Bir 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;
timeInSeconds
her zaman 0.000000
benim için geliyor. Nasıl düzeltirim?
long double
. Daha fazla hassasiyet elde etmek için a kullanmayı deneyebilirsiniz .
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
#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"
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";
}
usleep
her 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.
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:
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
perf stat -d ./a.out