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 : Sélectionner tout - Visualiser dans une fenêtre à part
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;
}