回答:
#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()
とclock_t
のC標準ライブラリのヘッダからありtime.h
、そのための使用は必要ありません。std
自分たちのライブラリを含める後の名前空間接頭辞を。<ctime>
その値と関数をstd
名前空間でラップしますが、使用する必要はありません。実装の詳細については、こちらを確認してください:en.cppreference.com/w/cpp/header/ctime
C ++ 11以降で利用可能で、移植可能で高精度の代替ソリューションはを使用することstd::chrono
です。
次に例を示します。
#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;
}
ideone.comでこれを実行すると、次のようになりました。
Delta t2-t1: 282 nanoseconds
using Clock=std::chrono::high_resolution_clock;
。タイプエイリアスを参照してください。
std::chrono::high_resolution_clock
すべてのstd lib実装にわたって単調ではありません。cppreferenceから- 通常
clock()
プログラムが起動してからのクロック刻みの数を返します。CLOCKS_PER_SEC
1秒間に発生するクロックティックの数を示す、関連する定数があります。したがって、次のような操作をテストできます。
clock_t startTime = clock();
doSomeOperation();
clock_t endTime = clock();
clock_t clockTicksTaken = endTime - startTime;
double timeInSeconds = clockTicksTaken / (double) CLOCKS_PER_SEC;
timeInSeconds
いつも0.000000
私のために来ています。どうすれば修正できますか?
long double
て、より精度を高めることができます。
少なくともWindowsでは、実際に正確な測定メカニズムはQueryPerformanceCounter(QPC)だけです。std :: chronoはそれを使用して実装されます(VS2015以降、それを使用する場合)が、QueryPerformanceCounterを直接使用するのと同じくらい正確ではありません。特に、1ナノ秒の粒度で報告することは絶対に正しくありません。したがって、非常に短い時間で測定する場合(そして、ケースがそのようなケースである可能性がある場合)、QPCまたはOSに相当するものを使用する必要があります。私はキャッシュのレイテンシを測定するときにこれに反対し、あなたが役に立つと思うかもしれないいくつかのメモをここに書き留めました。 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"
おそらくあなたはこのようなタイマーに興味があるかもしれません:H:M:S。ミリ秒
Linux OSのコード:
#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
要求した正確な量の後に常に戻るとは限りません。時にはそれは長くなります。最初に現在の時刻を確認してから、現在の時刻を確認して減算し、ループを毎回開始してからの絶対時間を取得する必要があります。
プログラムが動作する期間を測定できます。次の関数は、プログラムの開始以降のCPU時間の測定に役立ちます。
私の参照:アルゴリズムツールボックスウィーク1コースカリフォルニア大学サンディエゴ&国立研究大学高等経済学部によるデータ構造とアルゴリズムの専門化の一部
アルゴリズムの後にこのコード行を追加できます
cout << (double)clock() / CLOCKS_PER_SEC ;
期待される出力:数を表す出力 clock ticks per second
perf stat -d ./a.out