5

アルゴリズムの速度をミリ秒単位で計算する必要があります。C ++ / Cでは、どうすればこれを行うことができますか?入力の前と出力の後にsmthを書き込む必要がありますが、正確には何ですか?

4

4 に答える 4

14

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;
于 2012-07-23T08:47:18.333 に答える
4

正確な時間またはティックを測定する一般的な方法はありません。測定方法、オペレーティングシステム、およびコンピューターで発生するその他の処理(他のアプリケーション、グラフィカル出力、バックグラウンドプロセス)が結果に影響します。「十分な」(多くの場合)測定を行うには、さまざまな方法があります。

  • ライブラリ関数

    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)を最小の妥当な時間単位として計算します。

于 2012-07-23T09:07:19.023 に答える
1

C++11クロノライブラリの日付と時刻のユーティリティを使用できることに注意してください。cppreference.comから:

クロノライブラリは、3つの主要なタイプ(期間、クロック、および時点)と、ユーティリティ関数および一般的なtypedefを定義します。

GCC4.5.1でコンパイルされた記事のサンプルをここで参照してください

于 2012-07-23T09:59:54.533 に答える
0

この関数ライブラリを使用できます:

// 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あまり適応されていない場合もあります。システム関数を使用すると、より正確になります。

于 2012-07-23T09:13:13.130 に答える