[英]Serial code much slower than using only one thread in C?
因此,我正在使用線程進行一些基准測試,並編寫了以下代碼:
resp_threadless []和resp_threaded []是全局int數組,其大小為n;
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;
}
}
我通過打電話給她來對第一個功能進行基准測試:
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()調用多個線程不會並行化它,這只是一個測試,因為我的結果確實很奇怪,所以我決定看看使用SAME代碼的一個線程和一個函數會發生什么。
我在Intel Atom N270和NUMPROC = 1的Windows XP上進行了測試。
結果:序列號:1485 ms一個線程:425 ms
使用多處理器機器,甚至使用信號量來並行化線程完成的工作的代碼,我都有類似的結果。
有誰知道會發生什么事嗎?
編輯
顛倒順序,一次運行多次,等等...->不變
N更高->線程一按比例甚至更快
使用QueryPerformanceCounter()->不變
線程創建開銷->應該使線程更慢,而不是更快
原始代碼: http : //pastebin.com/tgmp5p1G
這是cache hit
問題。 我懷疑您按照問題描述的順序進行了基准測試。 首先調用該函數,然后調用該線程。 當您對此進行更詳細的基准測試時,您將觀察到以下原因:數據(sqrt)在高速緩存中可用,因此代碼執行得更快。 測試以證明:
function()
兩次,甚至更多次。 第二次調用function將已經給出更快的結果。 原因:所有sqrt計算(或至少很多)都可以在緩存中使用,而不必重新計算。 那快很多。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.