素因数分解を行うプログラムにおいて、処理時間を計算する必要があります。
#include <stdio.h>
#include <time.h>
main()
unsigned long i,t0,t1;
t0 = clock();
for(i=0; i<100000; i++){
}
t1 = clock();
printf("Time : %lf\n", t1 - t0);
}
などと例を作ってテストしているのですが、小さな単位まで出てきません。
100分の1秒単位で出てきているとおもいます。
もっと細かい時間を計測するのにはどうしたらいいのでしょうか?
No.5ベストアンサー
- 回答日時:
clock()は標準関数なので、ちょっと調べれば正しい使い方がすぐわかると思いますが・・・
まずclockの戻値はtime.h内で定義されている、clock_t型で受け取るようにしましょう。
あなたの環境ではたまたまunsigned longで実装されているのかもしれませんが、他の環境やバージョンでもそうだとは限りませんよ?
それからprintfの中ですが、unsigned long同士の引き算の結果はunsigned longになりますので、double型を期待する%lfでは正しく表示されません。
(正しく表示するには%luを使うか、(double)t1-t0としてキャストする。)
clock関数は1秒より小さい単位で時間を計測しますが、それは小数型で計測しているのではなく、秒より小さい単位を使って整数型で計測しています。(つまり単位は秒ではありません。)
これを秒単位に直すには、time.h内で定義されているCLK_TCKマクロを使います。
ではでは、下のサンプルを参考にしてみてください。
#include <stdio.h>
#include <time.h>
void main()
{
clock_t t0, t1;
int i;
t0 = clock();
for (i = 0; i < 100000; i++) {
/* 重い処理。バブルソートなんかいいかもね */
}
t1 = clock();
printf("Time:%f\n", (t1-t0) / CLK_TCK);
/* そういやdoubleは%fでした。long doubleは%Lfだし…。%lfって何!? */
}
No.4
- 回答日時:
unixであればgettimeofdayで秒とマイクロ秒が取得できます。
struct timeval {
long tv_sec; /* seconds */
long tv_usec; /* microseconds */
};
です。
加工すれば、目的となる数値が計算できるでしょう。
forのループは中で何か計算しないと最適化されて無くなるおそればあります。
また、unsigned longの値をdouble型で出力するのもどうかと思われます。
#include <sys/time.h>
#include <unistd.h>
main(){
struct timeval tm;
struct timezone tz;
gettimeofday(&tm, &tz);
}
windows系だと解りません。
No.3
- 回答日時:
こんにちわ。
これは、プログラミングをしている環境(OS)によって違ってくるのではないでしょうか?
例えば、FreeBSD(UNIX系?)ではgetrusageというシステムコールがあり、これを利用することで計測することができます。
あとは、複数回の計測を行い、上下のデータを外した平均を取るという方法もあったはずです。少なくとも1回の計測では、キャッシュの影響などが大きく出すぎるのではないかと思います。
お探しのQ&Aが見つからない時は、教えて!gooで質問しましょう!
似たような質問が見つかりました
- C言語・C++・C# プログラミングの授業の課題です 1 2023/01/17 22:15
- C言語・C++・C# バイナリファイルをコピーするのにかかる時間を測りたいのですが実行するとFatel error:gli 2 2022/11/03 01:10
- C言語・C++・C# win10で、正確な待ち時間の作り方 6 2023/02/14 18:28
- C言語・C++・C# カードシャッフルのブログラムを使ってc言語でブラックジャックをしたい 2 2022/04/12 15:13
- C言語・C++・C# このプログラミングの問題を教えてほしいです。 キーボードからデータ数nとn個のデータを入力し、平均値 3 2022/12/19 22:51
- C言語・C++・C# 10個の実数に対する降順ソート結果を出力するプログラムを作りたいのですが、以下のプログラムをどう直せ 1 2022/07/09 22:16
- C言語・C++・C# 3×3のラテン方陣をつくるプログラムを作成したのですが、(↓) #include <stdio.h> 5 2023/07/10 01:53
- C言語・C++・C# C言語 3 2022/10/04 15:07
- C言語・C++・C# C 言語の Gauss Jordan 法について 2 2022/12/28 11:16
- C言語・C++・C# c言語でユーザ関数を利用して複素数のべき乗と絶対値の数列を計算するプログラムが作りたいです。 3 2023/01/29 22:13
関連するカテゴリからQ&Aを探す
おすすめ情報
デイリーランキングこのカテゴリの人気デイリーQ&Aランキング
-
DoEvents関数って何?
-
win10で、正確な待ち時間の作り方
-
VBS でプログラムを先頭から再試行
-
実行時のCPU使用率を増やしたい
-
VB 電卓 メモリー機能
-
ノットイコールを教えて下さい
-
小数点を含む数値かどうか判断...
-
c言語。 組み合わせ最適化問題...
-
DLLで初回呼び出しと最後の...
-
numpyスライス機能を使った数値...
-
テキストファイルの空行をスキ...
-
Excel(VBA)でSetTimer関数を使...
-
C言語 時刻差分の算出方法
-
ExcelのVBAで再帰処理を使って...
-
ナップザック問題?をエクセル...
-
EXCELが高速に動く、PCを教えて...
-
VBでの簡易電卓の作成(減算方...
-
Excel VBA での処理時間計測結...
-
C言語:関数を使うメリットとデ...
-
キャッシュNFPについて
マンスリーランキングこのカテゴリの人気マンスリーQ&Aランキング
-
Excelでのセル内容の高速消去方法
-
DoEvents関数って何?
-
SQLの速度をあげるには・・・
-
小数点を含む数値かどうか判断...
-
win10で、正確な待ち時間の作り方
-
Excel(VBA)でSetTimer関数を使...
-
絶対パスの取得について
-
WebBrowserの読み込み待ちの処...
-
Excel VBAにて、2GB超の点群デ...
-
VBでの簡易電卓の作成(減算方...
-
テキストファイルの空行をスキ...
-
ノットイコールを教えて下さい
-
ナップザック問題?をエクセル...
-
If Not c Is Nothing Then ~延...
-
プログラム上のCPU稼働率低減に...
-
逆ポーランド記法における単項...
-
符号付きにすべきか、符号なし...
-
C言語 時刻差分の算出方法
-
C言語:関数を使うメリットとデ...
-
Excel VBA データ削除の高速化
おすすめ情報