0

私は Linux C について学び始めましたが、問題に遭遇したので混乱しました。
関数を使用しますtimesが、値が 0 に等しい値を返します。わかり
ました、間違いを犯しました。コードを変更しました。しかし、printf とはあまり関係がありません。clock_t は Linux では long で定義されているので、clock_t を long に変換します。
これは私のコードです:

#include <sys/times.h>
#include <stdio.h>
#include <stdlib.h>
int main()
{
   long clock_times;
   struct tms begintime;
   sleep(5);
   if((clock_times=times(&begintime))==-1)
      perror("get times error");
   else
   {
      printf("%ld\n",(long)begintime.tms_utime);
      printf("%ld\n",(long)begintime.tms_stime);
      printf("%ld\n",(long)begintime.tms_cutime);
      printf("%ld\n",(long)begintime.tms_cstime);
   }
   return 0;
}

出力: 0 0 0 0
また、0 を返します。
また、gdbを使用してデバッグし、begintimesの変数もゼロにします。機能を持つ親戚はありませんprintf。お願いします

4

2 に答える 2

3

これは珍しいことではありません。プロセスは、測定するのに十分な CPU 時間を使用していないだけです。プロセスが費やした時間はsleep()、プログラムの CPU 時間にはカウントされません。ユーザー命令の実行に費やされた CPU 時間times()(他の関連時間の中でも) は、プロセスがユーザー/カーネルの実行に費やした時間です。コード。

プログラムを次のように変更します。これはより多くの CPU を使用するため、測定できます。

#include <sys/times.h>
#include <sys/time.h>
#include <stdio.h>
#include <stdlib.h>
int main()
{
   long clock_times;
   struct tms begintime;
   unsigned i;

   for (i = 0; i < 1000000; i++)
      time(NULL);    // An arbitrary library call

   if((clock_times=times(&begintime))==-1)
      perror("get times error");
   else
   {
      printf("%ld %ld %ld %ld\n",
        (long)begintime.tms_utime,
        (long)begintime.tms_stime,
        (long)begintime.tms_cutime,
        (long)begintime.tms_cstime);
   }
   return 0;
}
于 2013-08-29T05:51:13.127 に答える
2

あなたのコードはほとんど CPU 時間を使用していないため、結果は正しいです。スリープはプログラムの実行を一時停止します。この時間に発生するすべてのことは実行時間ではないため、カウントされません。

空のループを追加すると、違いがわかります。(もちろん、コンパイラの最適化を無効にします。そうしないと、空のループが削除されます)。

「時間」プログラム出力 (time ./a.out) を見てください。「リアルタイム」時間 (gettimeofday() によって推定されると思います)、ユーザー時間 (ユーザー空間コードによって浪費された時間)、およびシステム時間 (timeファイルへの書き込み、ネットワーク接続のオープンなど)。

(確かに、「無駄」とは「使用済み」を意味しますが、何でも)

于 2013-08-29T05:48:22.680 に答える