Ah oui ça s'applique à grosso modo toute les machines bien entendu.
C'était pas forcément une très mauvaise idée, mais ça bouleverse la façon de coder. Ce qui est con, c'est d'avoir des bus aussi lent. Puis la PS3 a un coeur normal.
En fait, je souhaite appliquer ça dans un simple jeu, et j'en ai besoin pour l'équipement du joueur. J'ai un jeu dans lequel j'ai un joueur, qui a des statistiques personnelles, un équipement.
Et je souhaite créer un magasin dans lequel on peut choisir une arme à équiper. Cette arme possède des caractéristiques, que j'ai mis sous une structure (une valeur monétaire, une attaque, un ID qui l'identifie)
En gros, l'algorithme (très simplifié) serait :
-le joueur va dans le magasin (cette fonction magasin a besoin prend toutes les structures que j'ai expliqué précédemment)
-le joueur sélectionne une arme à l'aide d'un menu
-selon l'arme choisie, une fonction (prenant en paramètre la structure itemChoisi, qui est la structure qui contient l'ID et la valeur de l'arme) va assigner les caractéristiques demandés à la structure itemChoisi
-on retourne dans la fonction magasin, où on va comparer la valeur de l'arme et l'argent du joueur, et s'il possède assez d'argent, on va assigner les caractéristiques d'itemChoisi au joueur
sachant qu'itemChoisi est définie dans la fonction principale, et qu'elle sert de paramètre à la fonction magasin, qui fait elle même appel à la fonction armurerie, où sont les caractéristiques de chaque arme selon leur ID, il y a imbrication
Ca fait un bout de temps que je suis convaincu que tu perds des performances ridiculement des que tu n'as pas de controle sur OU tes donnes sont stocke en memoire. C'est pour ca que la notion de "high performance Java" m'a toujours laisse penseur. Tu ne peux pas placer tes donnees en memoire.
Donc comment tu vas avoir des performances?
Serieusement, quand en java tu fais un
FOO array[] = new FOO[30]; for (int i=0; i< 30; ++i) array[i] = new FOO(something);
Y a t'il un moyen de garantir la localite memoire des objets? De ce que je comprends, c'est entierement alloue dynamiquement. Et si tu as de la chance la JVM est suffisament inteligente pour mettre tous les objets FOO cote a cote. Mais c'est certainement pas forcement dans l'ordre du tableau. Et si tu as deux tableau qui contiennent les memes objets mais pas dans le meme ordre, clairement tu es nique. Alors que C++ te permet parfaitement de fixer l'ordre.
Quelqu'un a une quelconque information la dessus?
pour alligner la memoire j'utilise
http://developer.android.com/reference/java/nio/ByteBuffer.html
il y aussi la class unsafe
http://www.docjar.com/doc/docs/api/sun/misc/Unsafe.html
Mais ca, ca ne te permet pas de "placer" tes objets en memoire, ca te permet d'avoir access a un tableau de byte en utilisant un type primaire. Ou est ce que j'ai loupe qqch?
Peut-être avec certains package particulier qui font sauter certaines "sécurités" et particularités (je pensais à Unsafe), ou avec une JVM particulière, pas celle embarquée par défaut.
@godrik
jcomprend pas ske tu veux dire. tu veux alligner des classes dans la memoire ? c'est quoi le but ? tu peux donner un exemple en c++ ?
struct foo
{
int a,b,c,d;
float e,f,g,h;
zarbi buf[12];
void dosomething();
};
foo bar[10];
for (int i=0; i< 10; ++i)
bar[i].dosomething();
ici mes objets foo sont stocke de facon contigue en memoire. Acceder a n'importe quel variable de l'objet foo va charger les autre en memoire parcequ'ils sont soit sur la meme ligne de cache soit j'ai un access pattern qui est lineaire et donc le prefetcher hardware va fire son travail.
Si je veux faire le meme genre de chose a partir d'un buffer sans type en java, je vais perdre l'abstraction de offerte par le langage et je me retrouve a devoir faire des merdes du genre
char* bigbuffer;
char* base = bigbuffer+i*(sizeof(int)*4+sizeof(float)*4+precomp
utedsizeofzarbi*12);
((int*) base); //ouf ca c'est a!
sauf que tu les fais en java et pas en C. C'est super merdique a utiliser.
est ce que foo bar[10]; en java va te donner 10 objets lun apres l'autre ou fragmenter ? je saurai pas te le dire mais je sais que java rajoute un header avec des information pour le garbage collector a chaque objets.
par contre je revien sur ton premier exemple. en c++ sur windows
ABC = new obj[n];
est equivalent a
HeapAlloc(HEAP DU PROCESS, 0, sizeof(obj)*n);
ainsi tu est sur que ABC serras continus mais avec
for (int i=0; i< 30; ++i) array[i] = new FOO(something);
rien ne garantis que les objet dans array seront en continus dans la memoire meme avec c++.
En java, il n'y a que des references, donc la machine virtuelle fais ce qu'il lui plait.
En C++, si tu alloue tes objets statiquement ils seront contigue en memoire. Si tu alloue tes objets dynamiquement, ca depends de la tete de ton allocateur memoire. Si tu utilise le new par defaut alors les objets seront la ou malloc a de la place.
Mais tu peux ne pas utiliser l'operateur new par defaut et le remplacer par un autre. C'est classique de definir un operateur new particulier pour certain type d'objet afin qu'ils soient contigu en memoire.
Tu peux meme avoir des allocateurs specialise pour faire de l'allocation memoire plus fine. Par exemple, si tu ecris un serveur de jeu tu veux certainement que tous les joueurs soit proche en memoire. Donc tu va preallouer de la memoire pour les stocker et faire de l'allocation dynamique dans ce segment de memoire (et utiliser placement new pour faire la construction comme il faut). Cependant, si ton serveur gere plusieurs cartes a la fois, tu t'en fout certaiemnet que des joueurs sur deux cartes differente soit contigue en memoire. Tu veux certainement avoir un allocateur par carte afin de maximiser la localite memoire.
je vois bien ske tu veux dire. jutilise ce system avec les instruction SSE ki demande a ske tout sois aligner sur 128bits(ils existe des instruction pour les pointeurs non alligner mais elle sont plus lentes). De mémoire la premiere fois que jai vu ca ct avec le jeux doom qui reserve une block de 4 mo ensuite un memory manager propre au jeux utilise ce block comme une sorte de memoire virtuel pour l'entierete du jeux. le jeux ne fait apelle a malloc kune et une seule fois au lancement. ct une epoque ou les jeux etait fait sans thread et compagnie aujourdhui un tel system est impossible je pense. pour en revenir a java la philosophie du language c'est de ne pas faire joujou avec tout ca justement (donc forcement moin de controle).
en parlant de memory manager jai pas mal decran bleu a cause de celui ci sur windows 8 (jen avai aucun sur seven)
par contre jaime b1 metro.
C'est encore super classique les applications qui gerent leur memoire manuellement. Typiquement tu fais des pools par type d'objet que tu alloue par block de quelques MB. Quand le block est plein, tu realloues un autre block.
Evidement que le but de faire du java est de ne pas se poser ces questions la. Ce que je voulais dire c'est que par construction: "high performance java" ca n'a aucun sens. Tu n'auras jamais de haute perforance avec une application qui ne place pas sa memoire explicitement/intteligement.
Coucou
dîtes j'ai une petite question, trop petite pour en faire un topic, et j'ai un peu cherché mais rien trouvé.
En C, il existe une fonction qui nous retourne le plus grand nombre en plusieurs ? (4 dans mon cas).
Parce que la seule méthode que j'ai trouvé là c'est de mettre mes 4 nombres dans un tableau et de faire un tri à bulle (ce sera toujours que 4 nombres, jamais plus, donc ça va très bien comme tri
). Et ça me parait un peu "détourné" ![]()
pas compris la question. Expliques mieux pour voir?
J'ai 4 variables, d1, d2, d3 et d4. Je veux savoir laquelle est la plus grande. Donc je me demande s'il y a une fonction qui me retourne, sur 4 variables passées en paramètre, la plus petitevaleur (le max). Je sais que ça existe pour deux variables mais je me demande si par hasard ça existe pour 4 (même si je me doute bien que non
), ou, sinon, quelle est la méthode la plus simple/moins gourmande en temps/mémoire.
Là je les mets dans un tableau, que je trie (tri à bulle basique), puis je considère la première case comme la plus petite valeur.
La plus petite ou la plus grande en fait, les deux peuvent être utile. Pour le tri c'est pareil faut juste inverser ou prendre la valeur de la dernière case.
je parlai dun systeme avec une seule allocation au lancement pour tout le programme.
java: je sais kil existe des machine virtuel temp reel (la nasa l'utilise) avec une gestion memoire differente des jvm standards mais je sais pas dir ske ca vaux. en faite je nutilise plus java depuis plusieurs annees
jaime pas ce language pour tout dire.
mais en y repensant les linked list de java on un nombre minimum dobjet allouer (par 12 je crois). si la memoire est fragmenter je vois pas trop le but de ce minimum.
http://en.wikipedia.org/wiki/Real_time_Java
tikim, pouruqoi tu ne parcours pas ton ensemble a la recherche du plus grand element?
Tu vas rire mais j'y ai même pas pensé ![]()
(Du coup merci
)
Bonjour Tikim
Oui et non. Une autre méthode si tu as 4 variables isolées c'est juste de faire 3 fois un appel à la fonction max de math.h