アルゴリズムの速度をミリ秒単位で計算する必要があります。C ++ / Cでは、どうすればこれを行うことができますか?入力の前と出力の後にsmthを書き込む必要がありますが、正確には何ですか?
4 に答える
clock()
関数を使用<time.h>
clock()
して、プログラムの開始から何ティックが経過したかを示します。マクロCLOCKS_PER_SEC
には1秒あたりのティック数が含まれているため、実際に時間を取得できます。
//We start measuring here. Remember what was the amount of ticks in the
//beginning of the part of code you want to test:
int start = clock();
//<...>
//Do your stuff here
//<...>
int end = clock();//Now check what amount of ticks we have now.
//To get the time, just subtract start from end, and divide by CLOCKS_PER_SEC.
std::cout << "it took " << end - start << "ticks, or " << ((float)end - start)/CLOCKS_PER_SEC << "seconds." << std::endl;
正確な時間またはティックを測定する一般的な方法はありません。測定方法、オペレーティングシステム、およびコンピューターで発生するその他の処理(他のアプリケーション、グラフィカル出力、バックグラウンドプロセス)が結果に影響します。「十分な」(多くの場合)測定を行うには、さまざまな方法があります。
ライブラリ関数
clock(...)、clock_gettime(...)
標準のlib(in time.h
)から
gettimeofday(..) // for elapsed (wallclock) time
times(..) // process times
Linuxおよびその他のUNIXシステム用(内sys/time.h
)(Olegのコメントに従って編集)
ハードウェアカウンター:
__inline__ uint64_t rdtsc(void) { uint32_t lo, hi; __asm__ __volatile__( // serialize "xorl %%eax,%%eax \n cpuid":::"%rax", "%rbx", "%rcx", "%rdx"); __asm__ __volatile__("rdtsc":"=a"(lo), "=d"(hi)); return (uint64_t) hi << 32 | lo; } /*...*/ uint64_t t0 = rdtsc(); code_to_be_tested(); uint64_t t1 = rdtsc();
ハードウェアカウンターを直接読み取るため、この方法が好きです。
C ++ 11の場合:
std:chrono::highresolution_clock
typedef std::chrono::high_resolution_clock Clock; auto t0 = Clock::now(); code_to_be_tested(); auto t1 = Clock::now();
測定値はクロックサイクルに正確ではないことに注意してください。つまり、ナノ秒。私は常にマイクロ秒(10e-6 s)を最小の妥当な時間単位として計算します。
C++11クロノライブラリの日付と時刻のユーティリティを使用できることに注意してください。cppreference.comから:
クロノライブラリは、3つの主要なタイプ(期間、クロック、および時点)と、ユーティリティ関数および一般的なtypedefを定義します。
GCC4.5.1でコンパイルされた記事のサンプルをここで参照してください
この関数ライブラリを使用できます:
// clock.c
#include <time.h>
#include "clock.h"
struct clock { clock_t c1, c2; };
void start(clock *this) { this->c1 = clock(); }
void stop (clock *this) { this->c2 = clock(); }
double print(clock *this) { return (double)(c1 - c2) / CLOCKS_PER_SEC; }
// clock.h
#ifndef CLOCK_H_INCLUDED
# define CLOCK_H_INCLUDED
typedef struct clock clock;
extern void start(clock *);
extern void stop (clock *);
extern double print(clock *);
#endif // CLOCK_H_INCLUDED
ただし、clock
あまり適応されていない場合もあります。システム関数を使用すると、より正確になります。