如何在此代码中实现计时器中断来计算此fibonacci函数的秒数?

时间:2017-06-04 20:21:58

标签: c

我需要实现extern void start_stopper(void)和extern void end_stopper()。 如何实现这两个功能,以便他们将计算这个程序执行的秒数?

#include <stdio.h>
#include <dos.h>

extern void start_stopper(void);

unsigned long int fibo(int n)
{
  if (n <= 1)
    return 1;
  else
    return(fibo(n-1) + fibo(n-2));

} /* fibo */

extern double end_stopper();

void main(void)
 {
   unsigned long int fn;
   unsigned int n;
   double time_in_secs;

   int i1, i2, result;

   printf("Enter an integer <= 47 )\n");
   scanf("%u", &n);

   system("time");
   start_stopper();

   fn = fibo(n); 
   system("time");

   time_in_secs = end_stopper();

   printf("Fibo(%u) = %lu\n", n, fn);
   printf("Computation took %lf secs\n", time_in_secs);

 } /* main */

1 个答案:

答案 0 :(得分:2)

您应该使用time中定义的clock()函数,而不是使用<time.h> shell命令。它更精确,开销更少。

以下是修改后的代码:

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

unsigned long int fibo(int n) {
    if (n <= 1)
        return 1;
    else
        return fibo(n - 1) + fibo(n - 2);
}

int main(void) {
    unsigned long fn;
    unsigned int n;
    double time_in_secs;

    printf("Enter an integer <= 47:\n");
    if (scanf("%u", &n) == 1) {
        clock_t start = clock();

        fn = fibo(n); 

        time_in_secs = (double)(clock() - t) / CLOCKS_PER_SEC;

        printf("Fibo(%u) = %lu\n", n, fn);
        printf("Computation took %f secs\n", time_in_secs);
    }
    return 0;
}

如果您正在MS / DOS系统上进行编程,并且clock()在那里不可用,您可以尝试以这种方式进行定义:

#define CLOCK_PER_SEC  18.2
#define clock() (*(unsigned long __far *)0x0040006C)

节拍中断(INT 8)每小时更新一次32位节拍计数器65536次。可以在绝对地址0040:006C访问32位滴答计数器。如果您想要更精确的时序,可以尝试重新编程中断控制器,使其更快地触发中断。然后,您需要安装自己的处理程序来过滤这些中断,以避免弄乱系统的计时器。

这是一个有用的网站,有关PC / DOS系统及其BIOS数据的更多信息:http://www.fysnet.net/rombios.htm

另请注意,您的Fibonacci序列与经典定义fib(0) = 0, fib(1) = 1不一致。 Wikipedia article is here

以下是相应的代码:

unsigned long int fibo(int n) {
    if (n <= 1)
        return n;
    else
        return fibo(n - 1) + fibo(n - 2);
}