timing.c
上传用户:aoeyumen
上传日期:2007-01-06
资源大小:3329k
文件大小:2k
源码类别:

DVD

开发平台:

Unix_Linux

  1. /* 
  2.  *  timing.c
  3.  *
  4.  * Aaron Holtzman - May 1999
  5.  *
  6.  */
  7. //#define HAVE_TSC
  8. #include <stdio.h>
  9. #include <sys/time.h>
  10. #include "ac3.h"
  11. #include "timing.h"
  12. #if (!defined(HAVE_TSC) && !defined(HAVE_HRTIME))
  13. uint_64 (*get_time)(void);
  14. uint_64 timing_init(void) { }
  15. double timing_once_3(void (*func)(void*,void*,void*),void *arg_1,void *arg_2,void *arg_3) { }
  16. void timing_test_2(void (*func)(void*,void*),void *arg_1,void *arg_2,char name[]) {}
  17. void timing_test_3(void (*func)(void*,void*,void*),void *arg_1,void *arg_2,void *arg_3,char name[]){}
  18. #else
  19. # ifdef HAVE_TSC
  20. /* Read Pentium timestamp counter. */
  21. inline uint_64
  22. get_time()
  23. {
  24. long long d;
  25. __asm__ __volatile__ ("rdtsc" : "=&A" (d));
  26. return d;
  27. }
  28. uint_64
  29. timing_init(void)
  30. {
  31. uint_64 start,end,elapsed;
  32. long i;
  33. long iters = 1000;
  34. uint_64 mean = 0;
  35. for (i = 0; i < iters; i++)
  36. {
  37. start = get_time();
  38. end = get_time();
  39. if(i>0)
  40. {
  41. elapsed = end - start ;
  42. mean += elapsed;
  43. }
  44. }
  45. mean /= iters;
  46. return mean;
  47. }
  48. # else
  49. uint_64 (*get_time)(void);
  50. void
  51. timing_init(void)
  52. {
  53. hrtime_t start;
  54. start = gethrvtime();
  55. //Use the virtual microstate counter if it's available
  56. if(start == 0LL)
  57. get_time = gethrtime;
  58. else
  59. get_time = gethrvtime;
  60. }
  61. # endif
  62. void
  63. timing_test_2(void (*func)(void*,void*),void *arg_1,void *arg_2,char name[])
  64. {
  65. uint_64 start, end;
  66. uint_64 start_i, end_i;
  67. int i, iters = 10;
  68. printf("nTiming %s 10 timesn",name);
  69. start = get_time();
  70. for (i = 0; i < iters; i++)
  71. {
  72. start_i = get_time();
  73. func(arg_1,arg_2);
  74. end_i = get_time();
  75. printf("Iteration %d - %lld nsecn",i,end_i - start_i);
  76. }
  77. end = get_time();
  78. printf("Avg %s time = %lld nsecn", name,(end - start) / iters);
  79. }
  80. void
  81. timing_test_3(void (*func)(void*,void*,void*),void *arg_1,void *arg_2,void *arg_3,char name[])
  82. {
  83. uint_64 start, end;
  84. uint_64 start_i, end_i;
  85. int i, iters = 10;
  86. printf("nTiming %s 10 timesn",name);
  87. start = get_time();
  88. for (i = 0; i < iters; i++)
  89. {
  90. start_i = get_time();
  91. func(arg_1,arg_2,arg_3);
  92. end_i = get_time();
  93. printf("Iteration %d - %lld nsecn",i,end_i - start_i);
  94. }
  95. end = get_time();
  96. printf("Avg %s time = %lld nsecn", name,(end - start) / iters);
  97. }
  98. double timing_once_3(void (*func)(void*,void*,void*),void *arg_1,void *arg_2,void *arg_3)
  99. {
  100. uint_64 start, end;
  101. start = get_time();
  102. func(arg_1,arg_2,arg_3);
  103. end = get_time();
  104. return (end - start);
  105. }
  106. #endif