コードの実行にかかるシステム時間を測定したいと思います。これを行うには、getrusage()の2つの呼び出しの間に上記のコードを挟むことを知っていますが、予期しない結果が発生します...
#include <sys/time.h>
#include <sys/resource.h>
#include <unistd.h>
#include <stdio.h>
int main() {
struct rusage usage;
struct timeval start, end;
int i, j, k = 0;
getrusage(RUSAGE_SELF, &usage);
start = usage.ru_stime;
for (i = 0; i < 10000; i++) {
/* Double loop for more interesting results. */
for (j = 0; j < 10000; j++) {
k += 20;
}
}
getrusage(RUSAGE_SELF, &usage);
end = usage.ru_stime;
printf("Started at: %ld.%lds\n", start.tv_sec, start.tv_usec);
printf("Ended at: %ld.%lds\n", end.tv_sec, end.tv_usec);
return 0;
}
これにより2つの異なる数値が生成されることを願っていますが、残念ながら!私のコンピューターが1、2秒考えるのを見た後、これは結果です:
Started at: 0.1999s
Ended at: 0.1999s
Getrusage()を使用していませんか?これらの2つの数値が異なるべきではないのはなぜですか?私が根本的に間違っている場合、getrusage()を使用してソースコードのシステム時間を測定する別の方法はありますか?読んでくれてありがとう。
「ユーザー」と「システム」の時間の違いを誤解しています。サンプルコードは、測定中に主にユーザーモード(つまり、アプリケーションコードの実行)で実行されますが、「システム」時間は、カーネルモード(つまり、システムコールの処理)で実行される時間の尺度です。
ru_stime
は、システム時間を測定するための正しいフィールドです。テストアプリケーションは、チェックする2つのポイントの間にそのような時間が発生しないだけです。
代わりに、使用されるユーザーCPU時間であるusage.ru_utime
を使用する必要があります。
Gprofを使用します。これにより、各関数にかかる時間がわかります。 gprofをインストールし、これらのフラグをコンパイルに使用します-pg -fprofile-arcs-ftest-coverage。