我正在玩多線程(沒有以前的經驗),並有一個簡單的函數從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點。而且你的線程I/O可以忽略不計,所以他們大多數時間都很忙,因此他們之間的爭用更多表現不佳。 –
我看到了......感謝這裏的兩條評論 - 那麼我是否正確地說,我爲這臺機器上的未來計劃的多線程(帶有8個輻條的輪篩)有很好的機會被註定(註定他們對於循環(用一個小函數來獲取起點)在素數指標數組中翻轉1是相當無足輕重的)? - 我還沒有對它進行編碼,但是我看不到每個循環有多於五條指令(並且在輪輻之間跳轉) – HexedAgain