作者 主題: 這樣的程式碼測出的執行時間準確  (閱讀 17056 次)

0 會員 與 1 訪客 正在閱讀本文。

shihyu

  • 活潑的大學生
  • ***
  • 文章數: 223
    • 檢視個人資料
這樣的程式碼測出的執行時間準確
« 於: 2007-02-12 02:28 »
代碼: [選擇]

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

int main(void)
{
 clock_t start, end, diff_time;
 start = clock();//開始時間
    int i=0;
    char str;
    int a[6]={5,4,3,2,1};
    char b[6]="ab5d4";
   
    printf("一個int變數大小為:%d 所以每個記憶體相差%d\n",sizeof(i),sizeof(i));
   

    printf("int 陣列:\t");
    for(i;i<6;i++)
    {
        printf("[%d]\t",a[i]);
    }
    printf("\n");
    printf("記憶體位址:\t");
    for(i=0;i<6;i++)
    {
        printf("0x%x  ",&a[i]);
    }
    printf("\n\n");
    printf("一個char變數大小為:%d 所以每個記憶體相差%d\n",sizeof(str),sizeof(str));
    printf("char 陣列\t記憶體位址:\n");
    for(i=0;i<6;i++)
    {
        printf("[%c]\t\t0x%x\n",b[i],&b[i]);
    }
    printf("\n");
    end = clock();//結束時間
    diff_time =(double) (end-start)/(double)CLOCKS_PER_SEC;//秒數
  printf("\n執行時間 = %.1f s \t %d ms\n\n",diff_time,(end-start));
   
  return 0;
}


謝謝

Darkhero

  • 酷!學園 學長們
  • 俺是博士!
  • *****
  • 文章數: 3728
  • 性別: 男
    • 檢視個人資料
    • ㄚ凱隨手紀
這樣的程式碼測出的執行時間準確
« 回覆 #1 於: 2007-02-12 11:01 »
看不懂你要問什麼....
希望我們的討論是為了把問題解決,而不是爭論誰對誰錯.
『灌水才是重點,發文只是順便』
『我寧可讓不會釣魚的工程師餓死,也不想讓會餓死的工程師去攪沉公司....』
Blog: http://blog.darkhero.net/
秘密基地: http://www.darkhero.net/comic/
目前服務的網站: http://www.libook.com.tw/

shihyu

  • 活潑的大學生
  • ***
  • 文章數: 223
    • 檢視個人資料
Re: 這樣的程式碼測出的執行時間準確
« 回覆 #2 於: 2007-02-12 12:33 »
#include <stdio.h>
#include <stdlib.h>
#include <time.h>

int main(void)
{
 clock_t start, end, diff_time;
start = clock();//開始時間
    int i=0;
    char str;
    int a[6]={5,4,3,2,1};
    char b[6]="ab5d4";
   
    printf("一個int變數大小為:%d 所以每個記憶體相差%d\n",sizeof(i),sizeof(i));
   

    printf("int 陣列:\t");
    for(i;i<6;i++)
    {
        printf("[%d]\t",a);
    }
    printf("\n");
    printf("記憶體位址:\t");
    for(i=0;i<6;i++)
    {
        printf("0x%x  ",&a);
    }
    printf("\n\n");
    printf("一個char變數大小為:%d 所以每個記憶體相差%d\n",sizeof(str),sizeof(str));
    printf("char 陣列\t記憶體位址:\n");
    for(i=0;i<6;i++)
    {
        printf("[%c]\t\t0x%x\n",b,&b);
    }
    printf("\n");
   end = clock();//結束時間
    diff_time =(double) (end-start)/(double)CLOCKS_PER_SEC;//秒數
  printf("\n執行時間 = %.1f s \t %d ms\n\n",diff_time,(end-start));
   
  return 0;
}






我是想知道這樣程式執行時間用這樣計算能準確嗎???
還有(end-start) 跟 diff_time 上面程式計算這兩種時間差別在哪??


diff_time =(double) (end-start)/(double)CLOCKS_PER_SEC
diff_time 為何要在除上CLOCKS_PER_SEC ???

謝謝

ricky

  • 實習板主
  • 鑽研的研究生
  • *****
  • 文章數: 669
    • 檢視個人資料
    • Ricky 碎碎唸
這樣的程式碼測出的執行時間準確
« 回覆 #3 於: 2007-02-12 16:39 »
在PC上準確的測量執行時間是不太可能的
OS中要做的事情太多了
尤其是在系統負載很高時
時間的計算會更不準確
只能說這樣的計算方式是近似值
如果要準確的估算到千分之1秒以下得靠其他的手段了
我的symfony作品:YOMOpets 寵物誌
有興趣可以一起來討論symfony喔
我的部落格:http://ricky.ez2.us/

shihyu

  • 活潑的大學生
  • ***
  • 文章數: 223
    • 檢視個人資料
這樣的程式碼測出的執行時間準確
« 回覆 #4 於: 2007-02-12 19:52 »
那如果我想比較測試一下兩個程式效能好壞我應該如何去測試比較好??

謝謝

stlee

  • 鑽研的研究生
  • *****
  • 文章數: 817
    • 檢視個人資料
這樣的程式碼測出的執行時間準確
« 回覆 #5 於: 2007-02-13 19:20 »
引述: "shihyu"
那如果我想比較測試一下兩個程式效能好壞我應該如何去測試比較好??

如果是兩段程式碼要比較哪一段跑比較快的話倒是有個笨方法:

把這兩段分別用迴圈包起來各跑個1000萬次就測出來啦
程式是人寫的,別讓工具的限制成為您想像力的極限
~程式中最重要的部份應該是註解而不是程式碼,這是因為解讀註解一定比解讀程式碼簡單
~程式寫好後約一個月就會忘的差不多了,所以花點時間把註解寫好至少能讓自己(或別人)看的懂當初在寫什麼

Alan Liu

  • 懷疑的國中生
  • **
  • 文章數: 46
    • 檢視個人資料
這樣的程式碼測出的執行時間準確
« 回覆 #6 於: 2007-03-24 18:08 »
在Linux、Windows 這類多工的作業系統中
測出的時間可能不準

或許可以將程式編成 DOS 執行檔
然後在純 DOS ,且不載入任何常駐程式的情況下
執行測試
如此得到的數據應該比較正確

梁楓

  • 俺是博士!
  • *****
  • 文章數: 6220
    • 檢視個人資料
這樣的程式碼測出的執行時間準確
« 回覆 #7 於: 2007-03-24 23:59 »
嗯...
在程式的開頭跟結尾放個micotime來統計?

trainman

  • 憂鬱的高中生
  • ***
  • 文章數: 138
    • 檢視個人資料
Re: 這樣的程式碼測出的執行時間準確
« 回覆 #8 於: 2007-03-26 11:53 »
引述: "shihyu"


我是想知道這樣程式執行時間用這樣計算能準確嗎???
還有(end-start) 跟 diff_time 上面程式計算這兩種時間差別在哪??


diff_time =(double) (end-start)/(double)CLOCKS_PER_SEC
diff_time 為何要在除上CLOCKS_PER_SEC ???

謝謝


你一開始所宣告的變數: clock_t ( clock type ) 用來表示 clock ticks 數量的 type

如果去查一下 ,你可以知道

 clock() function 所返回的值為 clock ticks.

( clock ticks 是c / c++ 的基本計時單位,它的長短由 cpu 所控制 )

 這樣 end - start 是程式開始到結束的 clok ticks 的量

另外 CLOCKS_PER_SEC →Clock ticks per second

所以 end - start / CLOCKS_PER_SEC 單位就是秒了


另外程式所測量的時間準不準?

如果只是單純的測量一個程式執行的時間,或許會有誤差吧,畢竟它只能精準到 千分之

一秒,但是如果是用又比較兩個程式所執行的效果,我想就相當準確了。

參考參考…不知有沒有說錯… :o