Dlaczego jeden wątek jest szybszy niż wywołanie funkcji, mingw
Gdy wywołam funkcję, czas wykonania wynosi 6,8 sek. Wywołaj go z czasu wątku 3,4 s, a gdy używasz 2 wątków 1,8 sek. Bez względu na optymalizację używam racje pozostają takie same.
W Visual Studio czasy są jak oczekiwane 3,1, 3 i 1,7 sek.
#include<math.h>
#include<stdio.h>
#include<windows.h>
#include <time.h>
using namespace std;
#define N 400
float a[N][N];
struct b{
int begin;
int end;
};
DWORD WINAPI thread(LPVOID p)
{
b b_t = *(b*)p;
for(int i=0;i<N;i++)
for(int j=b_t.begin;j<b_t.end;j++)
{
a[i][j] = 0;
for(int k=0;k<i;k++)
a[i][j]+=k*sin(j)-j*cos(k);
}
return (0);
}
int main()
{
clock_t t;
HANDLE hn[2];
b b_t[3];
b_t[0].begin = 0;
b_t[0].end = N;
b_t[1].begin = 0;
b_t[1].end = N/2;
b_t[2].begin = N/2;
b_t[2].end = N;
t = clock();
thread(&b_t[0]);
printf("0 - %d\n",clock()-t);
t = clock();
hn[0] = CreateThread ( NULL, 0, thread, &b_t[0], 0, NULL);
WaitForSingleObject(hn[0], INFINITE );
printf("1 - %d\n",clock()-t);
t = clock();
hn[0] = CreateThread ( NULL, 0, thread, &b_t[1], 0, NULL);
hn[1] = CreateThread ( NULL, 0, thread, &b_t[2], 0, NULL);
WaitForMultipleObjects(2, hn, TRUE, INFINITE );
printf("2 - %d\n",clock()-t);
return 0;
}
Czasy:
0 - 6868
1 - 3362
2 - 1827
Procesor - Core 2 Duo T9300
OS - Windows 8, 64 - bit
kompilator: mingw32-g ++. exe, gcc wersja 4.6.2
edytować:
Próbowałem innej kolejności, tego samego wyniku, nawet próbowałem osobnych aplikacji. Menedżer zadań pokazuje wykorzystanie CPU na poziomie 50% dla funkcji i 1 wątku oraz 100% dla 2 wątków
Suma wszystkich elementów po każdym wywołaniu jest taka sama: 3189909.237955
Wynik Cygwina: wynik 2,5, 2,5 i 2,5 s Linux (pthread): 3,7, 3,7 i 2,1 sek
Wyniki @borisbn: 0 - 1446 1 - 1439 2 - 721.