Używam 64-bitowego systemu Windows 7 na 8-rdzeniowym procesorze. Uruchomiłem następujące:Dlaczego jeden wątek jest szybszy niż wiele wątków, mimo że mają one zasadniczo ten sam narzut?
#include "stdafx.h"
#include <iostream>
#include <Windows.h>
#include <process.h>
#include <ctime>
using namespace std;
int count = 0;
int t = time(NULL);
//poop() loops incrementing count until it is 300 million.
void poop(void* params) {
while(count < 300000000) {
count++;
}
cout<< time(NULL) - t <<" \n";
}
int _tmain(int argc, _TCHAR* argv[])
{
//_beginthread(poop, 0, NULL);
//_beginthread(poop, 0, NULL);
poop(NULL);
cout<<"done"<<endl;
while(1);
return 0;
}
Porównałem wynik, kiedy odkomentowałem beginThread. Okazuje się, że wersja z jednym gwintem osiąga to najszybciej! W rzeczywistości dodawanie kolejnych wątków powoduje, że proces trwa jeszcze dłużej. Wykonanie 300 milionów operacji sprawiło, że proces trwał 8+ sekund, co, jak sądziłem, było wystarczająco dobre, aby wykluczyć wywołania funkcji dla beginThread + inne niewielkie obciążenie.
Zrobiłem trochę badań i ogólny wniosek, że proces wielowątkowy jest wolniejszy, to koszty ogólne. Ale w tym przypadku, bez względu na to, czy uruchamiam wiele wątków, czy pojedynczych, liczba razy liczba zmiennych (która istnieje w segmencie danych, ponieważ jest to wstępnie przydzielona zmienna afaik) jest dostępna jest równa. Zasadniczo, narzut (jeśli jest to problem napowietrzny) nie wynika z faktu, że kosztuje więcej dostępu do zmiennej globalnej niż zmienna lokalna.
Patrząc na mojego menedżera zadań, proces z pojedynczym wątkiem używa 13% procesora (około 1/8 rdzenia), a dodawanie wątków zwiększa użycie procesora w krokach co 1/8. Więc jeśli chodzi o moc procesora, zakładając, że menedżer zadań dokładnie to przedstawia, dodawanie wątków używa więcej procesora. Co dalej wprowadza mnie w zakłopotanie .. jak to jest, że używam bardziej ogólnego procesora, z oddzielnymi rdzeniami, ale ogólnie biorąc trwa dłużej, aby wykonać to zadanie?
TLDR: Dlaczego tak się dzieje
To wygląda jak pole minowe dla wielu wątków modyfikujących zmienną naraz. – chris
tak. Treść linii poleceń w pamięci podręcznej. –
Wiele wątków modyfikujących ten sam obiekt bez synchronizacji: niezdefiniowane zachowanie. –