2016-01-29 26 views
1

我剛剛寫了一個簡單的代碼,以hh:mm:ss格式顯示時間。該代碼是從性能角度看有什麼不對?

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

int main() 
{ 
    time_t curtime; 
    int h, m, s, ps; 
    struct tm *x = localtime(&curtime); 

    time(&curtime); 
    ps = (*x).tm_sec; 
    while(1) 
    { 
     time(&curtime); 
     x = localtime(&curtime); 
     h = (*x).tm_hour; 
     m = (*x).tm_min; 
     s = (*x).tm_sec; 
     if(s != ps) 
     { 
      ps = s; 
      printf("%02d:%02d:%02d\n", h, m, s); 
     } 
    } 
    return(0); 
} 

代碼編譯並運行正常。然而,CPU使用率似乎非常高。當我使用'top'查看CPU使用率時,它顯示cpu%爲96-100%(我可以聽到電腦風扇大聲)。如何從性能角度改進代碼,使代碼簡單而簡潔?

+1

請參閱[是否可以問代碼優化問題幫助?](http://meta.stackoverflow.com/a/286559/1079354)以查看您缺少的內容。現在,沒有什麼我能看到的,會導致不良表現(除了那美妙的無限循環)。 – Makoto

+0

你正在退出'while(1)'? – Gopi

+0

雖然不是我所關注的。好吧,我可以添加一些條件說「如果(PS == 50)休息」。這會使它成爲更好的代碼嗎?這不是我正在談論的while循環。 CPU使用率仍然很高。 – anupamb

回答

5

的原因是,你的循環幾乎不含任何東西(的唯一的事情就是printf s到被等待,但我認爲你重定向或printf一些其他原因很快完成)。這意味着程序始終有資格運行。

另一方面,您的計算機上運行的所有其他程序通常會等待:用戶輸入,網絡消息或其他任何內容。這意味着他們沒有資格在大部分時間運行。因爲你的程序有工作要做,但是沒有其他進程(當前)會安排你的程序運行大部分時間(96-100%)。因此它會消耗那麼多的CPU。

這通常不是一件壞事。如果你的程序有工作要做,它應該有機會這樣做,如果它是唯一的程序。這不是關於性能 - 或者換句話說,就是操作系統會讓你的程序有機會盡快完成(雖然它不知道它在這種情況下完全不會完成)。

這些類型的進程(即CPU綁定的那些進程)經常會做的一件事是降低它們的優先級。這看起來似乎違反直覺,但實際上它會告訴操作系統爲該進程分配所有未用於其他任何處理能力的處理能力,這意味着只要有其他程序需要處理鼠標點擊,就可以使用處理能力,或鍵盤輸入(這意味着你不會注意到有很多CPU正在進行計算)。一些操作系統試圖自動執行此操作(例如,Linux會優先考慮等待很多操作的進程)。

+0

哇。對於我認爲範圍很小且最小的問題,這是一個出乎意料的出色答案。做得好。 – skrrgwasme

4

一般來說,由於你有一個無限循環,你的程序將使用所有的處理器能力來儘可能快地執行它自己。大多數簡單的c程序在幾秒內終止,所以這不是問題。但是,你的不。

爲了至少遏制CPU使用率,您可以在每次迭代循環後留下sleep()指令,以便系統有時間在其間執行其他操作。

下面是一個例子:

#include <stdio.h> 
#include <unistd.h> 

int main(void) { 
    while(1) { 
     printf("Aha"); 
     sleep(1);  // 1s sleep 
     // Windows: 
     // ::Sleep(500); // 500ms 
    } 
    return 0; 
} 
+0

'睡眠(500)'等待500 *秒*。 – alk

+0

@alk等待.... nvm你是對的。我心中有不同的語言。我糾正了它。 – Magisch

+0

在Windows上,'睡眠(500)'睡了半秒(500毫秒)。注意大寫S. –

相關問題