Salut !
Psycho V2 vient juste de sortir. Alors, comme tu as un jeu d'essai tout prêt, tu pourrais nous dire s'il y a beaucoup d'améliorations...
Salut !
Psycho V2 vient juste de sortir. Alors, comme tu as un jeu d'essai tout prêt, tu pourrais nous dire s'il y a beaucoup d'améliorations...
Salut !
Psycho V2 vient juste de sortir. Alors, comme tu as un jeu d'essai tout prêt, tu pourrais nous dire s'il y a beaucoup d'améliorations...
A propos d'optimisation...
J'ai écris un programme qui était censé être un prototype pour être
ensuite écrit en C.
Seulement voilà, il est déjà plus rapide qu'une version qui avait été
(mal) écrite en C++. C'est un programme genre calcul d'itinéraires, une
fonction récursive qui utilise intensivement les dictionnaires, lists et
arrays.
Ce qui m'étonne c'est que je ne gagne quasiment rien (10%) en utilisant
psyco. Du coup je me demande si j'y gagnerai quelque chose à le refaire
en C.
A propos d'optimisation...
J'ai écris un programme qui était censé être un prototype pour être
ensuite écrit en C.
Seulement voilà, il est déjà plus rapide qu'une version qui avait été
(mal) écrite en C++. C'est un programme genre calcul d'itinéraires, une
fonction récursive qui utilise intensivement les dictionnaires, lists et
arrays.
Ce qui m'étonne c'est que je ne gagne quasiment rien (10%) en utilisant
psyco. Du coup je me demande si j'y gagnerai quelque chose à le refaire
en C.
A propos d'optimisation...
J'ai écris un programme qui était censé être un prototype pour être
ensuite écrit en C.
Seulement voilà, il est déjà plus rapide qu'une version qui avait été
(mal) écrite en C++. C'est un programme genre calcul d'itinéraires, une
fonction récursive qui utilise intensivement les dictionnaires, lists et
arrays.
Ce qui m'étonne c'est que je ne gagne quasiment rien (10%) en utilisant
psyco. Du coup je me demande si j'y gagnerai quelque chose à le refaire
en C.
Par contre j'ai un exemple de code où le gain avec psyco (v1 ou v2) est
énorme, 18s contre 5 minutes. (en C 5s, en java 7s).
Le remplissage d'un damier avec des déplacement de chevaux...
Par contre j'ai un exemple de code où le gain avec psyco (v1 ou v2) est
énorme, 18s contre 5 minutes. (en C 5s, en java 7s).
Le remplissage d'un damier avec des déplacement de chevaux...
Par contre j'ai un exemple de code où le gain avec psyco (v1 ou v2) est
énorme, 18s contre 5 minutes. (en C 5s, en java 7s).
Le remplissage d'un damier avec des déplacement de chevaux...
Bonjour,
William Dode a écrit :Par contre j'ai un exemple de code où le gain avec psyco (v1 ou v2) est
énorme, 18s contre 5 minutes. (en C 5s, en java 7s).
Le remplissage d'un damier avec des déplacement de chevaux...
J'ai fait ça quand j'étais au service militaire... 1990... sur des
80386 (peut-être 16 MHz ?).
D'abord en Visual Basic, puis en TurboPascal 5.5 (compilé).
Avec la progression des algorithmes sur 5 jours, on est passé de 5
minutes à une demi-seconde... sur des 386.
Donc ton damier (echiquier) doit être énorme pour durer quelques
secondes avec les fréquences d'aujourd'hui !
Bonjour,
William Dode a écrit :
Par contre j'ai un exemple de code où le gain avec psyco (v1 ou v2) est
énorme, 18s contre 5 minutes. (en C 5s, en java 7s).
Le remplissage d'un damier avec des déplacement de chevaux...
J'ai fait ça quand j'étais au service militaire... 1990... sur des
80386 (peut-être 16 MHz ?).
D'abord en Visual Basic, puis en TurboPascal 5.5 (compilé).
Avec la progression des algorithmes sur 5 jours, on est passé de 5
minutes à une demi-seconde... sur des 386.
Donc ton damier (echiquier) doit être énorme pour durer quelques
secondes avec les fréquences d'aujourd'hui !
Bonjour,
William Dode a écrit :Par contre j'ai un exemple de code où le gain avec psyco (v1 ou v2) est
énorme, 18s contre 5 minutes. (en C 5s, en java 7s).
Le remplissage d'un damier avec des déplacement de chevaux...
J'ai fait ça quand j'étais au service militaire... 1990... sur des
80386 (peut-être 16 MHz ?).
D'abord en Visual Basic, puis en TurboPascal 5.5 (compilé).
Avec la progression des algorithmes sur 5 jours, on est passé de 5
minutes à une demi-seconde... sur des 386.
Donc ton damier (echiquier) doit être énorme pour durer quelques
secondes avec les fréquences d'aujourd'hui !
Le temps est celui pour trouver *toutes* les solutions, d'un damier 5x5
Le code est là si tu veux jeter un coup d'oeuil :
http://hg.flibuste.net/libre/games/cheval/
Les résultats :
c 1.65s
Le temps est celui pour trouver *toutes* les solutions, d'un damier 5x5
Le code est là si tu veux jeter un coup d'oeuil :
http://hg.flibuste.net/libre/games/cheval/
Les résultats :
c 1.65s
Le temps est celui pour trouver *toutes* les solutions, d'un damier 5x5
Le code est là si tu veux jeter un coup d'oeuil :
http://hg.flibuste.net/libre/games/cheval/
Les résultats :
c 1.65s
William Dode a écrit :
Le temps est celui pour trouver *toutes* les solutions, d'un damier 5x5
Le moins que l'on puisse dire est que le problème n'a pas été clairement formulé :
-- la contrainte c'est quoi ? elle n'est pas explicitement formulée. Parcourir
toutes les cases d'un échiquier N x N par un cavalier en sorte que
chaque case soit occupée une fois et une seule ?
-- où est le cavalier au départ ? A priori n'importe où ? C'est ce que
laisserait supposer les lignes 29-31 du code C mais ce serait quand même mieux
de ne pas avoir à jouer aux devinettes.
Le code est là si tu veux jeter un coup d'oeuil :
http://hg.flibuste.net/libre/games/cheval/
Les résultats :
c 1.65s
La variable i déclarée dans main() n'est pas utilisée.
Ça manque de commentaires. Et certaines constantes magiques telles que 400, 100
ou 5 n'aident pas à la lisibilité. Et si on veut changer l'échiquier en une
taille 8x8, il faut changer ces constantes ?
William Dode a écrit :
Le temps est celui pour trouver *toutes* les solutions, d'un damier 5x5
Le moins que l'on puisse dire est que le problème n'a pas été clairement formulé :
-- la contrainte c'est quoi ? elle n'est pas explicitement formulée. Parcourir
toutes les cases d'un échiquier N x N par un cavalier en sorte que
chaque case soit occupée une fois et une seule ?
-- où est le cavalier au départ ? A priori n'importe où ? C'est ce que
laisserait supposer les lignes 29-31 du code C mais ce serait quand même mieux
de ne pas avoir à jouer aux devinettes.
Le code est là si tu veux jeter un coup d'oeuil :
http://hg.flibuste.net/libre/games/cheval/
Les résultats :
c 1.65s
La variable i déclarée dans main() n'est pas utilisée.
Ça manque de commentaires. Et certaines constantes magiques telles que 400, 100
ou 5 n'aident pas à la lisibilité. Et si on veut changer l'échiquier en une
taille 8x8, il faut changer ces constantes ?
William Dode a écrit :
Le temps est celui pour trouver *toutes* les solutions, d'un damier 5x5
Le moins que l'on puisse dire est que le problème n'a pas été clairement formulé :
-- la contrainte c'est quoi ? elle n'est pas explicitement formulée. Parcourir
toutes les cases d'un échiquier N x N par un cavalier en sorte que
chaque case soit occupée une fois et une seule ?
-- où est le cavalier au départ ? A priori n'importe où ? C'est ce que
laisserait supposer les lignes 29-31 du code C mais ce serait quand même mieux
de ne pas avoir à jouer aux devinettes.
Le code est là si tu veux jeter un coup d'oeuil :
http://hg.flibuste.net/libre/games/cheval/
Les résultats :
c 1.65s
La variable i déclarée dans main() n'est pas utilisée.
Ça manque de commentaires. Et certaines constantes magiques telles que 400, 100
ou 5 n'aident pas à la lisibilité. Et si on veut changer l'échiquier en une
taille 8x8, il faut changer ces constantes ?
Ça manque de commentaires. Et certaines constantes magiques telles que 400,
100 ou 5 n'aident pas à la lisibilité. Et si on veut changer l'échiquier en
une taille 8x8, il faut changer ces constantes ?
Oui, c'est pour optimiser
Ça manque de commentaires. Et certaines constantes magiques telles que 400,
100 ou 5 n'aident pas à la lisibilité. Et si on veut changer l'échiquier en
une taille 8x8, il faut changer ces constantes ?
Oui, c'est pour optimiser
Ça manque de commentaires. Et certaines constantes magiques telles que 400,
100 ou 5 n'aident pas à la lisibilité. Et si on veut changer l'échiquier en
une taille 8x8, il faut changer ces constantes ?
Oui, c'est pour optimiser
William Dode, le 04/09/2009 a écrit :
[...]Ça manque de commentaires. Et certaines constantes magiques telles que 400,
100 ou 5 n'aident pas à la lisibilité. Et si on veut changer l'échiquier en
une taille 8x8, il faut changer ces constantes ?
Oui, c'est pour optimiser
Avant que vous ne vous fassiez gronder: je n'ai jeté un oeil qu'en
diagnonale, néanmoins il me semble que vous n'optimisez pas vraiment,
bien au contraire.
Vous écrivez par exemple:
int SIDE=5;
int SQR_SIDE%;
il manque déjà un const:
const int SIDE=5;
const int SQR_SIDE%;
pour augmenter les "chances" que le compilateur optimise. Mais le but
étant de bien montrer clairement ce qui est une constante dès la
compilation, autant faire:
#define SIDE 5
#define SQR_SIDE (SIDE * SIDE)
en "centralisant" au maximum (5 et 25 sont redondants, alors que 5 et
(SIDE * SIDE) ne le sont pas). Et en utilisant les macros partout où
c'est possible, ce qui ne me semble pas être le cas dans votre code,
loin s'en faut.
A ce moemnt-là tout ce petit monde sera remplacé avant la compilation
proprement-dite. Vous pouvez d'ailleurs ajouter un:
#define NB_CASES SQR_SIDE
absolument sans aucun coût en performance.
Pourquoi dire clairement au compilateur ce qui est connu, constant à la
compilation ? Pour qu'il puisse entrer dans un processus
d'optimisations pour lesquelles il est en général très doué. Deux
exemple: les multiplications par des constantes entières, pour
lesquelles il génèrera un code machine bien plus rapide que la
multiplication (en x86, le plus souvent un LEA). Si vous demandez une
optimisation en vitesse, il va également développer les boucles "assez
petites" pour peu que le nombre de passage soit connu à la compilation.
A 3, c'est toujours valable, à 5 également, à mon avis. Par exemple, la
boucle:
for(x = 0; x < 5; x++){
f(y, x);
}
(f() remplace du code, pas l'appel d'une fonction nécessairement).
sera compilée comme:
f(y, 0);
f(y, 1);
f(y, 2);
f(y, 3);
f(y, 4);
William Dode, le 04/09/2009 a écrit :
[...]
Ça manque de commentaires. Et certaines constantes magiques telles que 400,
100 ou 5 n'aident pas à la lisibilité. Et si on veut changer l'échiquier en
une taille 8x8, il faut changer ces constantes ?
Oui, c'est pour optimiser
Avant que vous ne vous fassiez gronder: je n'ai jeté un oeil qu'en
diagnonale, néanmoins il me semble que vous n'optimisez pas vraiment,
bien au contraire.
Vous écrivez par exemple:
int SIDE=5;
int SQR_SIDE%;
il manque déjà un const:
const int SIDE=5;
const int SQR_SIDE%;
pour augmenter les "chances" que le compilateur optimise. Mais le but
étant de bien montrer clairement ce qui est une constante dès la
compilation, autant faire:
#define SIDE 5
#define SQR_SIDE (SIDE * SIDE)
en "centralisant" au maximum (5 et 25 sont redondants, alors que 5 et
(SIDE * SIDE) ne le sont pas). Et en utilisant les macros partout où
c'est possible, ce qui ne me semble pas être le cas dans votre code,
loin s'en faut.
A ce moemnt-là tout ce petit monde sera remplacé avant la compilation
proprement-dite. Vous pouvez d'ailleurs ajouter un:
#define NB_CASES SQR_SIDE
absolument sans aucun coût en performance.
Pourquoi dire clairement au compilateur ce qui est connu, constant à la
compilation ? Pour qu'il puisse entrer dans un processus
d'optimisations pour lesquelles il est en général très doué. Deux
exemple: les multiplications par des constantes entières, pour
lesquelles il génèrera un code machine bien plus rapide que la
multiplication (en x86, le plus souvent un LEA). Si vous demandez une
optimisation en vitesse, il va également développer les boucles "assez
petites" pour peu que le nombre de passage soit connu à la compilation.
A 3, c'est toujours valable, à 5 également, à mon avis. Par exemple, la
boucle:
for(x = 0; x < 5; x++){
f(y, x);
}
(f() remplace du code, pas l'appel d'une fonction nécessairement).
sera compilée comme:
f(y, 0);
f(y, 1);
f(y, 2);
f(y, 3);
f(y, 4);
William Dode, le 04/09/2009 a écrit :
[...]Ça manque de commentaires. Et certaines constantes magiques telles que 400,
100 ou 5 n'aident pas à la lisibilité. Et si on veut changer l'échiquier en
une taille 8x8, il faut changer ces constantes ?
Oui, c'est pour optimiser
Avant que vous ne vous fassiez gronder: je n'ai jeté un oeil qu'en
diagnonale, néanmoins il me semble que vous n'optimisez pas vraiment,
bien au contraire.
Vous écrivez par exemple:
int SIDE=5;
int SQR_SIDE%;
il manque déjà un const:
const int SIDE=5;
const int SQR_SIDE%;
pour augmenter les "chances" que le compilateur optimise. Mais le but
étant de bien montrer clairement ce qui est une constante dès la
compilation, autant faire:
#define SIDE 5
#define SQR_SIDE (SIDE * SIDE)
en "centralisant" au maximum (5 et 25 sont redondants, alors que 5 et
(SIDE * SIDE) ne le sont pas). Et en utilisant les macros partout où
c'est possible, ce qui ne me semble pas être le cas dans votre code,
loin s'en faut.
A ce moemnt-là tout ce petit monde sera remplacé avant la compilation
proprement-dite. Vous pouvez d'ailleurs ajouter un:
#define NB_CASES SQR_SIDE
absolument sans aucun coût en performance.
Pourquoi dire clairement au compilateur ce qui est connu, constant à la
compilation ? Pour qu'il puisse entrer dans un processus
d'optimisations pour lesquelles il est en général très doué. Deux
exemple: les multiplications par des constantes entières, pour
lesquelles il génèrera un code machine bien plus rapide que la
multiplication (en x86, le plus souvent un LEA). Si vous demandez une
optimisation en vitesse, il va également développer les boucles "assez
petites" pour peu que le nombre de passage soit connu à la compilation.
A 3, c'est toujours valable, à 5 également, à mon avis. Par exemple, la
boucle:
for(x = 0; x < 5; x++){
f(y, x);
}
(f() remplace du code, pas l'appel d'une fonction nécessairement).
sera compilée comme:
f(y, 0);
f(y, 1);
f(y, 2);
f(y, 3);
f(y, 4);
Si tu peux améliorer le code, envoi moi un patch, je prend. Un meilleur
algo aussi, pourquoi pas.
Si tu peux améliorer le code, envoi moi un patch, je prend. Un meilleur
algo aussi, pourquoi pas.
Si tu peux améliorer le code, envoi moi un patch, je prend. Un meilleur
algo aussi, pourquoi pas.