2017-06-04 17 views
-1

我需要實現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 */ 
+0

容易只是存儲時間和計算的差異。 'time_t time(time_t * seconds)'和'double difftime(time_t time1,time_t time2)'from'time.h'將很容易做到這一點。 – twain249

+0

請閱讀[上一個問題](https://stackoverflow.com/questions/5248915/execution-time-of-c-program)。 –

+0

[C程序執行時間]的可能重複(https://stackoverflow.com/questions/5248915/execution-time-of-c-program) – Sneftel

回答

2

而不是使用time shell命令,你應該使用<time.h>定義的clock()功能。它的精確度遠低於開銷。

下面是修改代碼:

#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次。 32位刻度計數器可通過絕對地址0040:006C訪問。如果您想要更精確的時序,您可以嘗試重新編程中斷控制器,使其更快地觸發中斷。然後,您需要安裝自己的處理程序來過濾這些中斷,以避免混亂系統的計時器。

下面是關於PC/DOS系統及其BIOS的數據的詳細信息一個有用的網站:http://www.fysnet.net/rombios.htm

另外請注意,您的斐波那契序列是不符合經典定義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); 
}