时间(* time_t)没有得到当前时间(作业)

时间:2014-01-10 15:45:06

标签: c++ c

我们正在制作一些关于不同排序算法的报告。它们都在工作,但是在打印合并排序的处理时间时出现错误

我写了以下代码

...BubbleSort(arr3,50000);

time(&time_now); 
f = difftime(time_now,time_then);
printf("BubbleSort - tempo: %f\n",f);

time(&time_then); 
printf("then: %s",ctime(&time_then));
MergeSort(arr4,0,49999);

time(&time_now); 
printf("now: %s",ctime(&time_now)); 
f = difftime(time_now,time_then);

printf("MergeSort - tempo: %f\n",f);

但它总是说时间= 0s用于合并排序

enter image description here

似乎它无法获得当前时间或者mergesort的处理时间非常低(但它有效) 提前谢谢

4 个答案:

答案 0 :(得分:7)

您看到零,因为您的MergeSort非常快,以至于您的系统在可测量的时间间隔内完成。

为您的程序提供更多数据以进行排序应该会有所帮助。或者,您可以更改时间测量机制以获得更精确的信息。但第二种方法依赖于系统。

MergeSort的执行时间增长为N * log 2 (N),因此要查看与BubbleSort的时间相当的时间,其增长为N 2 ,你需要给它更多的数据。对于50,000个项目的数组,数学计算大小约为3,000 。如果您传递MergeSort大约50,000 * 3,000 = 150,000,000项的数组,则应该会看到打印的非零数字。

注意:不要尝试将那么多数据传递给BubbleSort - 它需要很长时间才能完成,除非数据已经非常接近于排序。

答案 1 :(得分:6)

不要使用time来计算程序/算法的运行时间。这是全球系统时间,包括抢占时间和运行后台的其他程序。

使用getrusage获取代码的资源(CPU时间)使用情况。

#include <stdlib.h>
#include <stdio.h>
#include <sys/resource.h>
#include <sys/time.h>



struct rusage start, end;
getrusage(RUSAGE_SELF, &start);

// run your code

getrusage(RUSAGE_SELF, &end);

struct timeval used_utime, used_stime;
timersub(&end.ru_utime, &start.ru_utime, &used_utime);
timersub(&end.ru_stime, &start.ru_stime, &used_stime);
printf("function ran for %d usec in user mode and %d usec in system mode \n"
    , used_utime.tv_sec * 1000 * 1000 + used_utime.tv_usec
    , used_stime.tv_sec * 1000 * 1000 + used_stime.tv_usec);

答案 2 :(得分:2)

取决于您是否需要经过时间或CPU时间。以下是两者。

  // On Raspberry Pi gcc timing.c -lrt -O3 -o timer

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

  double  theseSecs = 0.0;
  double  startSecs = 0.0;
  double  secs;
  double  CPUsecs = 0.0;
  double  CPUutilisation = 0.0;
  double  answer = 0;
  clock_t starts;

  void start_CPU_time()
  {      
      starts = clock();;
      return;
  }

  void end_CPU_time()
  {
      CPUsecs = (double)(clock() - starts)/(double)CLOCKS_PER_SEC;
      return;
  }    

  struct timespec tp1;
  void getSecs()
  {
     clock_gettime(CLOCK_REALTIME, &tp1);
     theseSecs =  tp1.tv_sec + tp1.tv_nsec / 1e9;           
     return;
  }

  void start_time()
  {
      getSecs();
      startSecs = theseSecs;
      return;
  }

  void end_time()
  {
      getSecs();
      secs    = theseSecs - startSecs;
      return;
  }    

  void calculate()
  {
      int i, j;
      for (i=1; i<100001; i++)
      {
          for (j=1; j<10001; j++)
          {
              answer = answer + (float)i / 100000000.0;
          }
      }
  }

 void main()
 {
     start_time();
     start_CPU_time();
     calculate();
     end_time();
     end_CPU_time();
     CPUutilisation = CPUsecs /  secs * 100.0;
     printf("\n Answer %10.1f, Elapsed Time %7.4f, CPU Time %7.4f, CPU Ut %3.0f%\n",
              answer, secs, CPUsecs, CPUutilisation);  
 }

答案 3 :(得分:0)

time函数和time_t类型粒度通常为秒,因此如果函数返回的时间小于1秒,则diff将为零。 对于快速和脏的基准测试,您可以使用clock()