8

プログラムの実行にかかる合計時間を教えてくれるように、プログラムに追加するCコードの行を知りたいのですが。mainの開始近くと、main関数の終了後にカウンターの初期化が必要だと思います。正しいヘッダーclock.hですか?

どうもありがとう...

更新私はWinXpマシンを持っています。clock()プログラムの最初とclock()最後に追加するだけですか?次に、時差を見積もることができます。はい、その通りですtime.h

これが私のコードです:

#include <stdio.h>
#include <stdlib.h>
#include <math.h>
#include <share.h>
#include <time.h>


void f(long double fb[], long double fA, long double fB);

int main() {

clock_t start, end;
start = clock();


const int ARRAY_SIZE = 11;

long double* z = (long double*) malloc(sizeof (long double) * ARRAY_SIZE);

int i;
long double A, B;

if (z == NULL) {
    printf("Out of memory\n");
    exit(-1);
}

A = 0.5;
B = 2;


for (i = 0; i < ARRAY_SIZE; i++) {
    z[i] = 0;
}

z[1] = 5;

f(z, A, B);

for (i = 0; i < ARRAY_SIZE; i++)
    printf("z is %.16Le\n", z[i]);



free(z);
z = NULL;

end = clock();
printf("Took %ld ticks\n", end-start);
printf("Took %f seconds\n", (double)(end-start)/CLOCKS_PER_SEC);



return 0;  
}  

void f(long double fb[], long double fA, long double fB) {
    fb[0] = fb[1]* fA;
    fb[1] = fb[1] - 1;
    return;
 }  

MVS2008のいくつかのエラー:

testim.c(16):エラーC2143:構文エラー:';'がありません 'const'の前  
testim.c(18):error C2143:構文エラー:';'がありません 'タイプ'の前  
testim.c(20):error C2143:構文エラー:欠落している';' 'タイプ'の前   
testim.c(21):error C2143:構文エラー:';'がありません 'タイプ'の前    
testim.c(23):エラーC2065:'z':宣言されていない識別子   
testim.c(23):warning C4047:'==':'int'は、'void*'とは間接レベルが異なります  
testim.c(28):エラーC2065:'A':宣言されていない識別子
testim.c(28):警告C4244:'=':'double'から'int'への変換、データが失われる可能性があります   

そしてそれは28のエラーになります。あなたの時計コードがなければ、エラーや警告は出ないことに注意してください。

最新ニュース:残念ながら、ここでは良い回答が得られませんでした。しかし、Googleで検索した後、コードは機能しています。ここにあります:

#include <stdio.h>
#include <stdlib.h>
#include <math.h>
#include <time.h>


void f(long double fb[], long double fA);

int main() {

clock_t start = clock();


const int ARRAY_SIZE = 11;

long double* z = (long double*) malloc(sizeof (long double) * ARRAY_SIZE);

int i;
long double A;

if (z == NULL) {
printf("Out of memory\n");
exit(-1);
}

A = 0.5;


for (i = 0; i < ARRAY_SIZE; i++) {
z[i] = 0;
}

z[1] = 5;

f(z, A);

for (i = 0; i < ARRAY_SIZE; i++)
printf("z is %.16Le\n", z[i]);



free(z);
z = NULL;

printf("Took %f seconds\n", ((double)clock()-start)/CLOCKS_PER_SEC);



return 0;
}

void f(long double fb[], long double fA) {
fb[0] = fb[1]* fA;
fb[1] = fb[1] - 1;
return;
}

乾杯

4月10日の更新:「JustJeff」のおかげでより良い解決策があります

#include <windows.h>
#include <stdio.h>
#include <stdlib.h>

void f(long double fb[], long double fA);

const int ARRAY_SIZE = 11;

int main(void)
{

   long double* z = (long double*) malloc(sizeof (long double) * ARRAY_SIZE);
   int i;
   long double A;

   LARGE_INTEGER freq;
   LARGE_INTEGER t0, tF, tDiff;
   double elapsedTime;
   double resolution;

   if (z == NULL) {
   printf("Out of memory\n");
   exit(-1);
   }
   QueryPerformanceFrequency(&freq);
   QueryPerformanceCounter(&t0);
   // code to be timed goes HERE
   {
    A = 0.5;


    for (i = 0; i < ARRAY_SIZE; i++) {
    z[i] = 0;
    }

    z[1] = 5;
    f(z, A);


    for (i = 0; i < ARRAY_SIZE; i++)
    printf("z is %.16Le\n", z[i]);

    free(z);
    z = NULL;

   }
QueryPerformanceCounter(&tF);
tDiff.QuadPart = tF.QuadPart - t0.QuadPart;
elapsedTime = tDiff.QuadPart / (double) freq.QuadPart;
resolution = 1.0 / (double) freq.QuadPart;
printf("Your performance counter ticks %I64u times per second\n", freq.QuadPart);
printf("Resolution is %lf nanoseconds\n", resolution*1e9);
printf("Code under test took %lf sec\n", elapsedTime);
return 0;
}


void f(long double fb[], long double fA) {
fb[0] = fb[1]* fA;
fb[1] = fb[1] - 1;
return;
}

MVS2008と2003年のBorlandC++builderXの両方で動作します。

4

6 に答える 6

6

Unix(私は思う)システムでは、timeコマンドライン引数としてプログラムの名前を指定したコマンドは、プログラムの実行にかかる時間を示します。これは、プログラム全体の実行時間を測定することに注意してください。1つの部分だけをテストする必要がある場合は、time.h多かれ少なかれ次のように、時計機能を含めて使用します。

#include <time.h>

int main() {
    clock_t start;
    clock_t end;
    int function_time;
    start = clock();
    function_you_want_to_time();
    end = clock();
    /* Get time in milliseconds */
    function_time = (double)(end - start) / (CLOCKS_PER_SEC / 1000.0);
    return 0;
}

それはあなたにミリ秒単位の時間を与えるでしょう(/ 1000.0部分に注意してください)。秒が必要な場合は、を削除し/ 1000.0ます。より正確なプレーンクロックティックが必要な場合は、を作成function_timeし、その行を次のようclock_tに置き換えます。function_time = ...

function_time = end - start;

_main()プログラム全体の時間を計るには、関数などを作成し、プログラムに関連するすべてのコードをmain()(タイミングコードではなく)からその関数に移動し、から呼び出すことをお勧めしますmain()。そうすれば、タイミングコードとプログラムの残りの部分がより明確になります。

于 2010-04-07T09:47:51.867 に答える
3

プログラムの合計が必要な場合は、Linuxコンソールで次のようにします。

$ time myProgram

コードでtime.hを使用することもできます。

#include <time.h>

int main(){
  time_t start, end;
  start = time(0);

  /* some working code */

  end = time(0);
  printf("%i seconds", end - start );
}
于 2010-04-07T09:57:43.573 に答える
3

別の回答者が提案したように、コードのブロックまたは* nixのプログラムをテストする場合は、clock()関数(in )を使用できます。例えば<time.h>time

> time ./foo my args

クロックの場合、2つのチェックポイント間の差を差し引く必要があります。例えば

#include <time.h>

void f() {
  clock_t start, end;

  start = clock();

  // some long code.

  end = clock();
  printf("Took %ld ticks\n", end-start);
  // or in (fractional) seconds.
  printf("Took %f seconds\n", (double)(end-start)/CLOCKS_PER_SEC);
}

アップデート

新しいエラーに関しては、VCでコードと宣言を混在させることはできません。関数を呼び出してから、変数の宣言を続けてはなりません。すべての変数を上部で宣言するか、C++モードでコンパイルします。

于 2010-04-07T09:48:03.463 に答える
1

おそらくtime.hとclock()関数が必要です。

于 2010-04-07T09:48:34.807 に答える
1

Windowsを使用していて、マイクロ秒単位で測定したい場合は、QueryPerformanceCounter()とQueryPerformanceFrequency()を調べてください。多くのシステムでは、これらは完全なプロセッサクロック周期(ナノ秒の3分の1)を解決できますが、3.5795MHzよりも粗く、マイクロ秒未満であることは今まで見たことがないと思います。

QueryPerformanceFrequency()を呼び出して、カウンターがカウントする1秒あたりのカウント数を決定します。次に、テスト対象のコードの前にQueryPerformanceCounter()を呼び出し、その後にもう一度呼び出します。QPCの2つの読み取り値をデルタ化し、QPFからの期間で割ると、2つのQPC呼び出し間の経過時間が得られます。そのようです ...

LARGE_INTEGER freq;
LARGE_INTEGER t0, tF, tDiff;
double elapsedTime;
QueryPerformanceFrequency(&freq);
QueryPerformanceCounter(&t0);
// code to be timed goes HERE
QueryPerformanceCounter(&tF);
tDiff.QuadPart = tF.QuadPart - t0.QuadPart;
elapsedTime = tDiff.QuadPart / (double) freq.QuadPart;
// elapsedTime now has your measurement, w/resolution given by freq

明らかに、これらはメインボード上のシステム発振器に接続されているハードウェアカウントデバイスにアクセスします。この場合、ソフトウェアの負荷によるジッターは発生しません。取得する解像度は、システムによって異なります。

ファローアップ

これは、インターフェースを示す非常に単純な完全なプログラムです。

#include <windows.h>
int main(void)
{
    LARGE_INTEGER freq;
    LARGE_INTEGER t0, tF, tDiff;
    double elapsedTime;
    double resolution;
    QueryPerformanceFrequency(&freq);
    QueryPerformanceCounter(&t0);
    // code to be timed goes HERE
    {
        Sleep(10);
    }
    QueryPerformanceCounter(&tF);
    tDiff.QuadPart = tF.QuadPart - t0.QuadPart;
    elapsedTime = tDiff.QuadPart / (double) freq.QuadPart;
    resolution = 1.0 / (double) freq.QuadPart;
    printf("Your performance counter ticks %I64u times per second\n", freq.QuadPart);
    printf("Resolution is %lf nanoseconds\n", resolution*1e9);
    printf("Code under test took %lf sec\n", elapsedTime);
    return 0;
}

これほど単純な場合は、IDEをスキップして、foo.cファイルに保存し、(MS VS 2008を想定して)コマンドラインを使用する方が簡単です。

cl foo.c

それを構築します。これが私のシステムの出力です:

Your performance counter ticks 3579545 times per second
Resolution is 279.365115 nanoseconds
Code under test took 0.012519 sec
于 2010-04-07T23:42:28.430 に答える
0

GetTickCountも試すことができます。時計も正常に動作します。ただし、他のプロセスまたは誰かが手動でシステム時間を変更すると、クロック値が変更されると思いますが、GetTickCount値はその影響を受けません。

于 2010-04-07T10:17:38.600 に答える