2012-12-02 47 views
0

我正在玩多線程(沒有以前的經驗),並有一個簡單的函數從int main調用通過兩個單獨的線程,只是改變(和創建)循環。據我所知,任何線程之間不存在依賴關係,但是使用一個線程運行我的計時是2.29秒,並且有兩個計時是7.11秒(我預計會有3-4秒)。我知道任何線程都不會獲得單個CPU的完全「所有權」,因爲int main()進程本身涉及一個線程(沿着一個線程)無論操作系統需要什麼),但我感到震驚的性能打擊(大概是線程切換!?)用一個簡單的程序慢多線程

有沒有什麼辦法可以在這裏做出改進? (可能會減少CPU在線程之間跳轉的工作量)。我希望能夠儘快做一些有趣的事情(用不同的線程擁有不同的輻條進行主輪篩分),但我對現在獲得的性能印象不深。

我現在擁有的簡單代碼如下:

#include <iostream>" 
#include <ctime> 
#include <pthread.h> 


void* foo(void* dummyVar) 
{ 
    for(int i=1; i < 10; i++) 
    { 
     for(int j=1; j < 50000000; j++) 
     { 
      int test = j; 
     } 
      std::cout << i << "\n"; 
    } 
    pthread_exit(NULL); 
} 

int main(int argc, const char *argv[]) 
{ 
    clock_t start = clock(); 
    pthread_t thread1; 
    pthread_t thread2; 
    pthread_attr_t attribute; 
    void* status; 
    pthread_attr_init(&attribute); 
    pthread_attr_setdetachstate(&attribute, PTHREAD_CREATE_JOINABLE); 
    int i = 0; 
    int b = pthread_create(&thread1, NULL, foo, (void*)i); 
    int c = pthread_create(&thread2, NULL, foo, (void*)i); 
    pthread_join(thread1, &status); 
    pthread_join(thread2, &status); 

    std::cout << ((double)clock() - start)/CLOCKS_PER_SEC << "\n"; 
    return 0; 
} 

更新:我得到更好的效果僅具有一個其它線程調用foo也(而不是兩個線程)後,相關的main()的調用了foo線程,儘管多線程是(很明顯!)在這臺機器上仍然較慢(對foo進行了一些更改 - 現在只有一個for循環 - 時序爲5.17和6.01)

+1

太原始/短暫的任務可能會產生比實際好處更高的線程切換開銷。 –

+1

就你而言,你所說的線程數不僅僅是硬件的可用性,這是第1點。而且你的線程I/O可以忽略不計,所以他們大多數時間都很忙,因此他們之間的爭用更多表現不佳。 –

+0

我看到了......感謝這裏的兩條評論 - 那麼我是否正確地說,我爲這臺機器上的未來計劃的多線程(帶有8個輻條的輪篩)有很好的機會被註定(註定他們對於循環(用一個小函數來獲取起點)在素數指標數組中翻轉1是相當無足輕重的)? - 我還沒有對它進行編碼,但是我看不到每個循環有多於五條指令(並且在輪輻之間跳轉) – HexedAgain

回答

2
for(int j=1; j < 50000000; j++) 
    { 
     int test = j; 
    } 

適當的臺階標記可以是一種藝術,但這種情況很快會持平。此代碼生存的唯一方法是忘記打開優化器。哪一個體面的編譯器會完全消除循環,因爲它沒有任何有用的副作用。

假設你實際上沒有打開優化,實際上是測量10次

std::cout << i << "\n"; 

永遠無法同時運行的聲明,該線程將被爭奪的是串行訪問的終端/主機鎖。預期的結果是,這確實會變慢。

但是,如果您忘記了優化器,絕不會在沒有啓用它的情況下剖析代碼,因此您不會以這種方式發貨。

+0

啊哈!非常感謝你指出這一點 - 如果我設置了優化標誌(編譯器肯定忘了它!),那麼編譯器肯定會殺死循環 - 進一步在foo之外播放和設置靜態變量爲J + i的值(它沒有(至少在這種情況下)優化的副作用)和註釋std :: cout我現在有多線程稍微贏得以下:1.18對1.21 – HexedAgain