質問をすることでしか得られない、回答やアドバイスがある。

15分調べてもわからないことは、質問しよう!

新規登録して質問してみよう
ただいま回答率
85.46%
C

C言語は、1972年にAT&Tベル研究所の、デニス・リッチーが主体となって作成したプログラミング言語です。 B言語の後継言語として開発されたことからC言語と命名。そのため、表記法などはB言語やALGOLに近いとされています。 Cの拡張版であるC++言語とともに、現在世界中でもっとも普及されているプログラミング言語です。

Q&A

解決済

2回答

852閲覧

回転にかかる時間を測定したいです。

nagano-yuhi

総合スコア39

C

C言語は、1972年にAT&Tベル研究所の、デニス・リッチーが主体となって作成したプログラミング言語です。 B言語の後継言語として開発されたことからC言語と命名。そのため、表記法などはB言語やALGOLに近いとされています。 Cの拡張版であるC++言語とともに、現在世界中でもっとも普及されているプログラミング言語です。

0グッド

0クリップ

投稿2021/07/30 14:09

2次元配列を90度左回転するのにかかる時間を測定したいです。以下のコードを実行すると、0秒と表示されてしまい、N=2048だと1秒と表示されます。もっと測定の精度を上げるにはどうすればいいですか。教えていただきたいです。

#include <stdio.h> #include <stdlib.h> #include <time.h> void rotate(int N, int **m){ int i, j, start, end; int temp; j=0; end=N; for(start=0;start<N/2;start++){ end--; for(i=start;i<end;i++){ temp=m[j][N-1-i]; m[j][N-1-i]=m[N-1-i][N-1-j]; m[N-1-i][N-1-j]=m[N-1-j][i]; m[N-1-j][i]=m[i][j]; m[i][j]=temp; } j++; } return; } int main(void){ int i, j, N; N=1024; int **m=(int**)malloc(N*sizeof(int*)); m[0]=(int*)malloc(N*N*sizeof(int)); for(i=0;i<N;i++){ m[i]=m[0]+i*N; } for(i=0;i<N;i++){ for(j=0;j<N;j++){ m[i][j]=i+j; //printf("%2d ", m[i][j]); } //printf("\n"); } time_t start_time, end_time; start_time=time(NULL); rotate(N, m); end_time=time(NULL); printf("time:%.8f\n", (double)end_time-start_time); /*for(i=0;i<N;i++){ for(j=0;j<N;j++){ printf("%2d ", m[i][j]); } printf("\n"); }*/ return 0; }

気になる質問をクリップする

クリップした質問は、後からいつでもMYページで確認できます。

またクリップした質問に回答があった際、通知やメールを受け取ることができます。

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

int32_t

2021/07/30 14:21

このコードを実行するOSは何でしょうか?
nagano-yuhi

2021/07/30 14:25

windows?です。ubuntuで実行しました。
int32_t

2021/07/30 14:29

WindowsとUbuntuのどちらですか? WSL? どうやってコードをコンパイルしていますか?
nagano-yuhi

2021/07/30 14:30

それならubuntuです。 ubuntu上でgcc rotate.cとしてコンパイルし、./a.outとして実行しました。
nagano-yuhi

2021/07/30 14:42

int32_tさん 解決しました。ありがとうございます。
guest

回答2

0

timespec_get() で(最高で)ナノ秒単位の時間を取得できます。よほど古いUbuntuでなければたぶん使えるでしょう。

c

1 struct timespec ts; 2 uint64_t start_nano, end_nano; 3 timespec_get(&ts, TIME_UTC); 4 start_nano = (uint64_t)ts.tv_sec * 1000000000 + ts.tv_nsec; 5 6 // 計測したい処理はここに。 7 8 timespec_get(&ts, TIME_UTC); 9 end_nano = (uint64_t)ts.tv_sec * 1000000000 + ts.tv_nsec; 10 printf("time:%" PRIu64 " nsec\n", (end_nano - start_nano));

macOS 10.15 で試してみたところ下3桁が常に000だったので、この環境ではマイクロ秒精度のようです。

投稿2021/07/30 14:50

編集2021/07/30 14:57
int32_t

総合スコア21008

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

nagano-yuhi

2021/07/30 14:51

ありがとうございます。試してみます。
guest

0

ベストアンサー

N=2048だと1秒と表示されます。もっと測定の精度を上げるにはどうすればいいですか。

たとえばfor-loopで1000回 rotate するのに要する時間を求めれば。

投稿2021/07/30 14:33

編集2021/07/30 14:35
episteme

総合スコア16614

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

nagano-yuhi

2021/07/30 14:35

精度というと語弊があったみたいです。 1秒としか表示されないので、例えば0.87秒といった具合に少数表示する方法をお聞きしたかったです。 紛らわしくてすみません
episteme

2021/07/30 14:36

1000回やるのに 870秒かかったら 1回 0.87秒。
nagano-yuhi

2021/07/30 14:41

なるほど、できました。 ありがとうございます。
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

15分調べてもわからないことは
teratailで質問しよう!

ただいまの回答率
85.46%

質問をまとめることで
思考を整理して素早く解決

テンプレート機能で
簡単に質問をまとめる

質問する

関連した質問