所以,我在做與線程一些基準測試,我寫這些作品的代碼:串行代碼比使用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
也許你當前的線程(在其中調用'function()')具有低優先級? – SomeWittyUsername
您是否在單個程序執行過程中按順序運行了兩個測試?我懷疑'vetor []'訪問的數據緩存效果。 – yohjp
1.您是否嘗試顛倒順序,先線程後才能運行? (緩存效果)2.你是如何測量時間的? – Arno