Parallélisation d'un appel à "new"
Re bonjour tous le monde, c'est encore moi.
La on tombe de haut la parallélisation semble échouer à cause des "new"
quand on fait des 100 000 new string
avec 1 thread ça prend 104 ms sur un QuadCore
et maintenant le plus étrange
quand on fait des 400 000 string *s = new string(""),
avec 4 threads sur un QuadCore, ça prend 900 ms par thread !!! (chaque thread faisant 100000 new)
une création de variable (string s = "";) se parallélise sans problème.
Est-ce que quelqu'un déjà eut ce type de problème ? Quels solutions ? (à part ne pas utiliser les "new")
voici le code d'exemple, évidement vous ne pourrais pas voir le problème si vous n'avez pas au minimum un dual-core.
Code:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40
| #include "stdafx.h"
#ifdef WIN32
#pragma comment(lib, "../SDL-1.2.11/lib/SDL.lib")
#pragma comment(lib, "../SDL-1.2.11/lib/SDLmain.lib")
#endif
#include "../SDL-1.2.11/include/SDL.h"
#include <string>
#include <iostream>
using namespace std;
int InstanceString( void *data )
{
int countS = 0;
Uint32 lastDt=SDL_GetTicks(), dtS;
while (true)
{
//string *s = new string(); delete s; //ne se parallélise pas
for (int i =0; i < 30; i++) string s = ""; //fonctionne correctement
countS++;
if (countS%100000 ==0)
{
dtS = SDL_GetTicks();
cout << "\n" << dtS - lastDt;
lastDt = dtS;
}
}
return 0;
}
int _tmain(int argc, _TCHAR* argv[])
{
SDL_CreateThread( InstanceString, (void*)NULL);
SDL_CreateThread( InstanceString, (void*)NULL);
SDL_CreateThread( InstanceString, (void*)NULL);
SDL_CreateThread( InstanceString, (void*)NULL);//*/
int inte;
cin >> inte;
} |