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.

questionAnswers(4)

yourAnswerToTheQuestion