2012-10-21 32 views
6

所以,我在做與線程一些基準測試,我寫這些作品的代碼:串行代碼比使用C中只有一個線程慢得多?

resp_threadless []和resp_threaded []是全球INT數組和其大小爲n;

function(); 

,第二個這樣的:

HANDLE hThreadArray[1]; 
DWORD dwThreads[1]; 
hThreadArray[0] = CreateThread(NULL, 0, function_th, NULL , 0, &(dwThreads[0])); 
WaitForMultipleObjects(1, hThreadArray, TRUE, INFINITE); 
CloseHandle(hThreadArray[0]); 

請記住,我知道,調用使用function_th多線程

int n = 100000; 

void function() { 
    for (long j = 0; j < n; ++j) { 
    int count = 0; 
    double x = vetor[j]; 
     while (x > 1.0) { 
     x = sqrt(x); 
     ++count; 
    } 
    resp_threadless[j] = count; 
    } 
} 

DWORD WINAPI function_th(LPVOID lpParam) { 
for (long j = 0; j < n; ++j) { 
    int count = 0; 
    double x = vetor[j]; 
     while (x > 1.0) { 
     x = sqrt(x); 
     ++count; 
    } 
    resp_threadless[j] = count; 
    } 
} 

我剛好叫她爲基準的第一功能()不會並行化,這只是一個測試,因爲我的結果非常奇怪,所以我決定看看使用SAME代碼的一個線程和一個函數會發生什麼。

我在英特爾凌動N270進行了測試,Windows XP時NUMPROC = 1

結果: 串行代碼:1485毫秒 一個線程:425毫秒

我有類似的結果使用多處理器機器,甚至使用信號量的代碼來並行化線程完成的工作。

有沒有人有任何想法會發生什麼?

編輯

反轉的順序,運行多次每一個,等... - >無變化

高N - >主題之一是按比例甚至更快

使用QueryPerformanceCounter的( ) - >無變化

線程創建開銷 - >應該讓線程更慢一些,不要更快

原始碼:http://pastebin.com/tgmp5p1G

+0

也許你當前的線程(在其中調用'function()')具有低優先級? – SomeWittyUsername

+2

您是否在單個程序執行過程中按順序運行了兩個測試?我懷疑'vetor []'訪問的數據緩存效果。 – yohjp

+0

1.您是否嘗試顛倒順序,先線程後才能運行? (緩存效果)2.你是如何測量時間的? – Arno

回答

2

這是一個cache hit的問題。我懷疑你是按照你在問題中描述的順序做了基準測試。該函數首先被調用,並且線程被調用。當您更詳細地對此進行基準測試時,您將觀察原因:數據(sqrt)在緩存中可用,因此代碼執行速度會快得多。 測試以坡口:

  1. 調用線程之前運行function()兩次,甚至更頻繁。 函數的第二個調用將會給出更快的結果。
  2. 在函數之前調用線程,結果將顯示相反的結果。 該功能將顯示更好的結果。

原因:所有的sqrt計算(或至少它們中的很多)在高速緩存中可用,無需重新計算。這要快得多。

+0

我試過倒轉另一個,多次運行它們,我也得到了相同的結果。 – ruback

+0

好吧,我確實使用了你的代碼,並做到了這一點。結果非常清楚。 **再次:**您是如何進行時間測量的?你可以報告連續運行'function()'和'function_th()'的時間嗎? – Arno

+0

我實際上運行5次每個函數,並獲得平均值。 我正在測量獲得「(double)clock()/ CLOCKS_PER_SEC;」的時間並從另一箇中減去一個。 – ruback

相關問題