1

以下の行列乗算の実行時間を測定するために助けを求めたいです。Windowsでコードを実行しています。time.hを使用しようとしましたが、測定できません。タイマーはどこに置けばいいですか?

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

void main()
{
    int m1[10][10],i,j,k,m2[10][10],add[10][10],mult[10][10],r1,c1,r2,c2;
    /*double dif;
    time_t start, end;*/

    printf("Enter number of rows and columns of first matrix MAX 10\n");
    scanf("%d%d",&r1,&c1);
    printf("Enter number of rows and columns of second matrix MAX 10\n");
    scanf("%d%d",&r2,&c2);
    if(r2==c1)
    {
        printf("Enter rows and columns of First matrix \n");
        printf("Row wise\n");
        for(i=0;i<r1;i++)
        {
            for(j=0;j<c1;j++)
                scanf("%d",&m1[i][j]);
        }
        printf("You have entered the first matrix as follows:\n");
        for(i=0;i<r1;i++)
        {
            for(j=0;j<c1;j++)
                printf("%d\t",m1[i][j]);
            printf("\n");
        }
        printf("Enter rows and columns of Second matrix \n");
        printf("Again row wise\n");
        for(i=0;i<r2;i++)
        {
            for(j=0;j<c2;j++)
                scanf("%d",&m2[i][j]);
        }
        printf("You have entered the second matrix as follows:\n");
        for(i=0;i<r2;i++)
        {
            for(j=0;j<c2;j++)
                printf("%d\t",m2[i][j]);
            printf("\n");
        }
        /*time (&start);*/
        printf("Now we multiply both the above matrix \n");
        printf("The result of the multiplication is as follows:\n");
        /*a11xA11+a12xA21+a13xA31 a11xA12+a12xA22+a13xA32 a11xA13+a12xA23+a13xA33*/
        for(i=0;i<r1;i++)
        {
            for(j=0;j<c2;j++)
            {
                mult[i][j]=0;
                for(k=0;k<r1;k++)
                {
                    mult[i][j]+=m1[i][k]*m2[k][j];
                    /*mult[0][0]=m1[0][0]*m2[0][0]+m1[0][1]*m2[1][0]+m1[0][2]*m2[2][0];*/
                }
                printf("%d\t",mult[i][j]);
            }
            printf("\n");
            /*time (&end);
            dif (difftime (end, start);
            printf("Time of execution is : %f\n",dif)*/
        }
        getch();
    }
    else
    {
        printf("Matrix multiplication cannot be done");
    }
}

できるだけ正確に測定したい。

4

3 に答える 3

2

への呼び出しの直前に、現在持っているループの外側にある「終了時間」コードを使用するのが最善だと思いますgetch()。これにより、1 秒以上カウントする可能性が最大になります。適切な測定値を取得するには、おそらく乗算全体を何度も繰り返す必要があります (合計経過時間が数十秒で測定されるようにするため)。ループ内での印刷も避ける必要があります。印刷時間が計算時間の大半を占める可能性があります。

残りの問題は、time()システム コールがタイミングで 1 秒の解像度を提供することです。gettimeofday()(マイクロ秒) やclock_gettime()(ナノ秒)などの 1 秒未満の分解能のタイミング ルーチンが本当に必要です。分解能と精度が異なることに注意してください。(clock()代わりに標準 C を使用できますが、通常ははるかに低い解像度を提供します。歴史的に、ftime()times()も使用できました。これらはミリ秒の解像度を与えました。) Windows で使用できるシステム コールは他にもあります。10x10 行列の乗算を実行するのに時間がかからないため、タイミングを有効にするためにかなりの繰り返し回数 (1000 回、または 10,000 回、または 1,000,000 回) が必要になります。

于 2012-05-28T05:28:51.743 に答える
1

時間関数の精度に依存するため、コードの実行時間が 1 秒未満の場合、正しい出力を取得できません。Windowsでは、GetTickCountを使用することを好みます

サンプル

#include "Windows.h"
int main (void)
{
  DWORD start,end;
  start = GetTickCount();
  //do something like Sleep(1000)
  end = GetTickCount();
  printf("elapse %d milliseconds\n", end - start);
  return 0;
}
于 2012-05-28T05:29:08.230 に答える
0

を使用してはclock()どうですか?

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

int main() {
 clock_t start, stop;
 double t = 0.0;

 /* Start timer */ 
 start = clock();    
 assert(start != -1);

 /* Perform calculations */

 /* Stop timer */
 stop = clock();
 t = (double) (stop-start)/CLOCKS_PER_SEC; 
 printf("Run time: %f\n", t);

 return(0);
} /* main */
于 2012-05-28T05:28:53.907 に答える