2011-05-02 60 views
1
double SumOfSquare()() 
{ 
    int i; 
    double T3,total=0; 

    for(i=0;i<200;i++) { 
     clock_t start = clock(); 

     int n=100,sum=0; 
     for(int i =1;i<=n;i++) { 
      sum=sum+i*i; 
     } 


    clock_t end = clock(); 
    T3=double(end-start)/(double) CLOCKS_PER_SEC; 
    total=total+T3; 
    } 

    T3=total/200; 

    return T3; 
} 


int main() 
{ 

    double T3=SumOfSquare(); 
    cout<<T3<<endl; 
    return 0; 
} 

該代碼應該返回該代碼的執行時間的值,而不是返回一些奇怪的輸出,比如「5e-006」而不是執行時間。爲什麼?程序的執行時間是「5E-006」?

+4

'雙SumOfSquare()()'真的? – 2011-05-02 14:55:13

+0

ahh我複製了錯誤的代碼,它必須在第二個括號內 – Anon 2011-05-02 14:57:55

+0

請發佈一個[簡短,自包含的完整示例(請參見sscce.org)](http://sscce.org/)。您的示例可能會縮短以揭示問題的真實性質,缺少至少一行代碼,並且存在編譯錯誤。 – 2011-05-02 15:00:10

回答

4

T3是一個雙精度值,它的值是5微秒,所以沒有什麼是錯的。

+0

ahh所以不是輸出0.000005而是說這個 – Anon 2011-05-02 14:57:11

+0

@Anon - 浮點數據流輸出將(幾乎)總是以指數格式打印。畢竟,指數可能真的很大(或很小),並且打印所有這些零都會浪費空間。 – 2011-05-02 15:01:16

+0

@ T.E.D。它也更具可讀性,假設你理解符號。 – 2011-05-02 15:08:19

6

5e-0065 * 10^-60.000005是相同的東西。是什麼讓你覺得不是的執行時間?

5e-006是寫在E notation一個數字。)

+0

是的,我不明白,起初,但謝謝 – Anon 2011-05-02 15:09:46

2

看一看操縱。它們用於格式化輸出流,以便您可以獲得更明智的外觀結果。

+0

寫你自己的操縱,所以你可以邏輯上指定你輸出。 – 2011-05-02 16:33:39

2

5e-006只是5 * 10 -6的標準指數符號,即0.000005。這與6μs相同。

2

正如其他人已經指出,你會得到5微秒的結果,這似乎至少合理作爲時間。

但是,我會計算時間有點不同。我積累「滴答」的次數爲循環,然後總數達到秒轉換:

static const int iterations = 200; 
clock_t total=0; 
double seconds; 

for(i=0;i<iterations;i++) { 
    clock_t start = clock(); 

    int n=100,sum=0; 
    for(int i =1;i<=n;i++) { 
     sum=sum+i*i; 
    } 
    total += clock() - start; 
} 

return total/double(CLOCKS_PER_SEC*iterations); 

一個浮點除法,而不是和浮點加法每次迭代,這確實整數加法每次迭代,並在最後一個單浮點部門。在低端硬件上,這可能會更快。更重要的是,它可能更準確,幾乎與硬件無關 - 在浮點數中增加一長串小數字是經常導致精確度嚴重損失的情況之一。

+0

更重要的是,我只會在外循環前後調用'clock'。我也要確保'sum'被用在某個地方;編譯器很有可能完全消除內部循環,因爲它對程序的可觀察行爲沒有任何影響。 – 2011-05-02 16:35:43

+0

提升循環的時間將取決於 - 如果您嘗試測量循環開銷,保持循環可能很重要。否則,我同意整個循環的時間可能會更好。我認爲理所當然的是'sum'被用在某處(至少它不是一個局部變量),但是你肯定是正確的,最好明確地陳述它。 – 2011-05-02 16:42:18

+0

@Jerry Coffin如果循環中的代碼很短,那麼您必須提取循環中的時間以獲得任何重要的測量;如果對'clock'的調用返回0或1,那麼你沒有做任何重要的測量。如果您擔心循環開銷的影響,那麼與空循環進行比較可能會改善某些事情(但是,確實如此,它確實很不準確)。 – 2011-05-02 17:10:41

0

顯而易見的答案是,您的代碼只需要5微秒 執行。可能因爲你從不使用sum,所以 編譯器將消除任何用於修改其值的代碼(因此 因此是內部循環)。最重要的是,您的測量 可能由clock的粒度決定。你也 想要測量儘可能大的一段時間:如果兩個電話clock是 小於約5分鐘的一部分(但當然,我會用很多 我懷疑是 測量調試程序時更短的時間間隔:-))。我的解決方案 (我不是說它是完美的)一般已經把 代碼在虛擬函數中進行測量,派生類 中的函數在基類中什麼都不做, 之類的東西:

class Base 
{ 
    static int ourCount; 
    static double ourTare; 
    virtual void doRun(); 
public: 
    double run(); 
    static void setCount(int count); 
}; 

int Base::ourCount = 0; 
double Base::ourTare = 0.0; 

void Base::doRun() {} 

double Base::run() 
{ 
    clock_t start = clock(); 
    for (int count = ourCount; count > 0; -- count) 
     doRun(); 
    clock_t end = clock(); 
    return (static_cast<double>(end - start)/CLOCKS_PER_SEC - ourTare; 
} 

void Base::setCount(int count) 
{ 
    ourCount = count; 
    ourTare = 0.0; 
    // The following has been sufficient in the past. If the 
    // compiler inlines Base::run, however, it could be 
    // insufficent. (In my own code, Base::run is in a 
    // separate translation unit.)` 
    ourTare = Base().run(); 
} 

class Derived 
{ 
    int d; 
    virtual void doRun(); 
public: 
}; 

void Derived::doRun() 
{ 
    int sum = 0; 
    for (int i = 1; i <= 100; ++ i) { 
     sum += i * i; 
    } 
    d = sum; 
} 

然後調用Base::setCount與計數(東西 簡單的像這樣的,東西少繞一百萬是 無用比),創建導出的實例,並調用它run到 獲得的總時間秒。如果您想要每次迭代的時間,您可以將它除以 計數。

(A更輕率的答案是,該方案的產出 "5e-006"因爲編譯器壞了。這不是一個法律 輸出在C任何浮點值++)