Journal benchmark pour le fun

Posté par  . Licence CC By‑SA.
Étiquettes :
7
19
mar.
2014

Sommaire

Pour raconter ma life, je reprends le code d'un vieux rpg en php pour faire un truc pour mes gamins, j'ajoute quelques modifs, surtout des images pour le moment. Globalement le truc se passe sur une "carte" de 500x500 cases et on se déplace, faisant des rencontres aléatoires. Mais c'est un pee brut et je veux ajouter des images, donc un "fond de carte" et lorsqu'on arrive sur une "case" il s'affiche une image, juste pour meubler l'écran.

Je refuse directement l'image aléatoire et choisi un truc que j'ai vu ailleurs : une "matrice" de caractères avec chaque caractère différent étant une image, par exemple

OOOOOOOO.O
OOOO11O.OO
OOO111.OOO
OOOO..OOOO
OO..OOOOOO

avec O étant l'herbe, 1 la montagne et . de l'eau, par exemple.

Ensuite j'ai juste à afficher l'image correspondante au paysage. Il faut bien entendu générer cette matrice" mais c'est un autre problème.

La question que je me posais est : fichier texte ou base de donnée ? j'ai bien tenté de venir poser la question ici, dans un forum mais je connaissais déjà la réponse des chafouins : fais un benchmark.. dont acte.

Pour que vous puissiez le reproduire chez vous, voila mes outils :

la création des matrices de 500 zeros.

fichier php

<?
//make_fichier.php
echo ('<?'."\n");
for ($i=0;$i<500;$i++) {
echo('$truc['.$i.']="0000... (500 ) ...000";'."\n");
echo ('?>');
?> 

ensuite un php make_fichier.php > fichier.php donne

<?
$truc[0]="0000..(500)..000";
$truc[1]="0000..(500)..000";
$truc[2]="0000..(500)..000";
(……)
$truc[499]="0000..(500)..000";
?>

pour la base de donnée

mysql > create table bench (id int not null primary key, data text(500));

<?
//make_fichier.php
for ($i=0;$i<500;$i++) {
echo ("insert into bench values($i,'0000..(500)..000');\n");
}
?> 

ensuite un php make_fichier.php > fichier.sql donne

insert into bench values(0,'000… (500) …000');
insert into bench values(1,'000… (500) …000');
insert into bench values(2,'000… (500) …000');
(……)
insert into bench values(499,'000… (500) …000');

que l'on insère par

mysql > .\ fichier.sql

Le script de bench

avec le fichier "texte" (php)

<?
print("benchmarck include php ====================\n");
$mem_usage = memory_get_usage(true); 
echo round($mem_usage/1024,2)." kilobytes" . "\n";

include("fichier.php");
for($i=5;$i<500;$i+=2){
echo ($truc[$i][$i]);}

$mem_usage = memory_get_usage(true); 
echo "\n".round($mem_usage/1024,2)." kilobytes" . "\n";
?>

on le lance avec :
strace -c -Ttt php bench.php

benchmarck include php ====================

512 kilobytes
00.. (500) ..00

1024 kilobytes

% time seconds usecs/call calls errors syscall


100.00 0.000098 1 137 mmap2
0.00 0.000000 0 63 read
0.00 0.000000 0 252 write
0.00 0.000000 0 143 67 open
0.00 0.000000 0 81 close
0.00 0.000000 0 1 execve
0.00 0.000000 0 3 time
0.00 0.000000 0 40 39 access
0.00 0.000000 0 17 brk
0.00 0.000000 0 8 8 ioctl
0.00 0.000000 0 1 gettimeofday
0.00 0.000000 0 2 readlink
0.00 0.000000 0 50 munmap
0.00 0.000000 0 1 clone
0.00 0.000000 0 1 uname
0.00 0.000000 0 21 mprotect
0.00 0.000000 0 12 3 llseek
0.00 0.000000 0 5 rt_sigaction
0.00 0.000000 0 2 rt_sigprocmask
0.00 0.000000 0 3 getcwd
0.00 0.000000 0 1 getrlimit
0.00 0.000000 0 70 55 stat64
0.00 0.000000 0 19 2 lstat64

0.00 0.000000 0 81 fstat64
0.00 0.000000 0 4 getdents64
0.00 0.000000 0 4 1 futex
0.00 0.000000 0 1 set
thread_area
0.00 0.000000 0 1 set_tid_address
0.00 0.000000 0 1 set_robust_list
0.00 0.000000 0 2 socket
0.00 0.000000 0 2 2 connect


100.00 0.000098 1029 177 total

donc le fichier texte consomme 512 Ko de mémoire en plus que le simple executable php.

et un time php bench.php donne

real 0m0.025s
user 0m0.008s
sys 0m0.016s

php et mysql

<?
print("benchmarck mysql_php====================\n");
$mem_usage = memory_get_usage(true); 
echo round($mem_usage/1024,2)." kilobytes" . "\n";

$con=mysql_connect("localhost","xxxxxx","xxxxxx");
mysql_select_db("xxxxxx",$con);

for($i=5;$i<500;$i+=2){
$query="SELECT substring(data,$i,1) as texte FROM bench where id=$i";
$nbr=mysql_query($query);
$n=mysql_fetch_array($nbr);
print $n["texte"];}

$mem_usage = memory_get_usage(true); 
echo "\n".round($mem_usage/1024,2)." kilobytes" . "\n";
?>

trace -c -Ttt php bench.php

benchmarck mysql_php====================

512 kilobytes
000.. (500)… O0
512 kilobytes
% time seconds usecs/call calls errors syscall


56.87 0.000236 1 316 read
43.13 0.000179 0 503 write
0.00 0.000000 0 143 67 open
0.00 0.000000 0 82 close
0.00 0.000000 0 1 execve
0.00 0.000000 0 2 time
0.00 0.000000 0 40 39 access
0.00 0.000000 0 14 brk
0.00 0.000000 0 8 8 ioct
0.00 0.000000 0 1 gettimeofday
0.00 0.000000 0 2 readlink
0.00 0.000000 0 49 munmap
0.00 0.000000 0 1 clone
0.00 0.000000 0 1 uname
0.00 0.000000 0 21 mprotect
0.00 0.000000 0 12 3 llseek
0.00 0.000000 0 251 poll
0.00 0.000000 0 7 rt_sigaction
0.00 0.000000 0 2 rt_sigprocmask
0.00 0.000000 0 2 getcwd
0.00 0.000000 0 1 getrlimit
0.00 0.000000 0 136 mmap2
0.00 0.000000 0 71 55 stat64
0.00 0.000000 0 18 2 lstat64
0.00 0.000000 0 78 fstat64
0.00 0.000000 0 4 getdents64
0.00 0.000000 0 5 fcntl64
0.00 0.000000 0 5 1 futex
0.00 0.000000 0 1 set
thread_area
0.00 0.000000 0 1 set_tid_address
0.00 0.000000 0 1 set_robust_list
0.00 0.000000 0 3 socket
0.00 0.000000 0 3 2 connect
0.00 0.000000 0 1 shutdown
0.00 0.000000 0 4 1 setsockopt


100.00 0.000415 1790 178 total

time php bench.php

real 0m0.035s
user 0m0.012s
sys 0m0.012s

php et mysql par mysqli

<?php
print("benchmarck mysqli_php====================\n");
$mem_usage = memory_get_usage(true); 
echo round($mem_usage/1024,2)." kilobytes" . "\n";

$con=mysqli_connect("localhost","xxxxxx","xxxxxx","xxxxxx");


for($i=5;$i<500;$i+=2){
$query="SELECT substring(data,$i,1) as texte FROM bench where id=$i";
$nbr=mysqli_query($con,$query);
$n=mysqli_fetch_array($nbr);
print $n["texte"];}

$mem_usage = memory_get_usage(true); 
echo "\n".round($mem_usage/1024,2)." kilobytes" . "\n";
?>

strace -c -Ttt php bench.php

benchmarck mysqli_php====================
512 kilobytes
00… (500) …O0
512 kilobytes
% time seconds usecs/call calls errors syscall


27.17 0.000097 1 143 67 open
26.05 0.000093 0 314 read
21.01 0.000075 2 40 39 access
13.73 0.000049 1 71 55 stat64
12.04 0.000043 0 501 write
0.00 0.000000 0 82 close
0.00 0.000000 0 1 execve
0.00 0.000000 0 2 time
0.00 0.000000 0 14 brk
0.00 0.000000 0 8 8 ioctl
0.00 0.000000 0 1 gettimeofday
0.00 0.000000 0 2 readlink
0.00 0.000000 0 49 munmap
0.00 0.000000 0 1 clone
0.00 0.000000 0 1 uname
0.00 0.000000 0 21 mprotect
0.00 0.000000 0 12 3 llseek
0.00 0.000000 0 248 poll
0.00 0.000000 0 5 rt_sigaction
0.00 0.000000 0 2 rt_sigprocmask
0.00 0.000000 0 2 getcwd
0.00 0.000000 0 1 getrlimit
0.00 0.000000 0 136 mmap2
0.00 0.000000 0 18 2 lstat64
0.00 0.000000 0 78 fstat64
0.00 0.000000 0 4 getdents64
0.00 0.000000 0 2 fcntl64
0.00 0.000000 0 5 1 futex
0.00 0.000000 0 1 set
thread_area
0.00 0.000000 0 1 set_tid_address
0.00 0.000000 0 1 set_robust_list
0.00 0.000000 0 3 socket
0.00 0.000000 0 3 2 connect
0.00 0.000000 0 1 shutdown
0.00 0.000000 0 4 1 setsockopt


100.00 0.000357 1778 178 total

time bench.php

real 0m0.002s
user 0m0.000s
sys 0m0.004s

Voila, en gros je fais ce que je veux, c'est moins consommateur de mémoire de passer par mysql, mais un peu plus long et un peu plus de processeur, mais rien de bien flagrant.

Maintenant les benchmark ca vaut ce que ca vaut. Je le partage ici parce que si j'en avais trouvé un, je ne l'aurais pas fait, si cela peut servir à quelqu'un.

  • # Mouais

    Posté par  (site web personnel) . Évalué à -2.

    Du bon vieux PHP procedural et du MySQL dans le meme post. Tu pouvais attendre vendredi mec serieux !

    • [^] # Re: Mouais

      Posté par  (site web personnel) . Évalué à 4.

      Certes, concernant MySQL il y a plein d'optimisations possibles, donc …

      mais pour le "procédural", j'ai toujours entendu dire que c'était plus rapide et moins gourmand que du objet, mais moins confortable pour le développeur.
      C'est vrai ou pas? SI ce programme était écrit en objet, ça irait plus vite? moins vite?
      En fait, dans je doute que ce soit significatif.

      Enfin, pour générer les cartes, pourquoi ne pas se baser sur le système de fractales, comme pour la génération des galaxies du jeux Frontier Elite II?

      Pourquoi bloquer la publicité et les traqueurs : https://greboca.com/Pourquoi-bloquer-la-publicite-et-les-traqueurs.html

      • [^] # Re: Mouais

        Posté par  . Évalué à 8. Dernière modification le 20 mars 2014 à 09:20.

        mais pour le "procédural", j'ai toujours entendu dire que c'était plus rapide et moins gourmand que du objet, mais moins confortable pour le développeur. C'est vrai ou pas? SI ce programme était écrit en objet, ça irait plus vite? moins vite?

        On s'en balance un peu. Bencher comme ca sans raison le DL d'une matrice 500x500 ça ne sert absolument à rien. Si tu fais ton petit truc dans ton coin pour 5 utilisateurs ca sera de toute façon suffisamment rapide pour ne pas avoir a t'en soucier (c'est bien d'avoir une idée des ordres de grandeur). Si tu fais un truc qui va prendre de la charge dans la face ou que ton besoin c'est pas 500x500 mais NxN alors tu prends en compte ces paramètres dans ta conception et dans tes tests:

        • Si tu charges toujours toute la map, pourquoi la stocker par ligne dans la BDD ?
        • Si tu n'es intéressé que par une sous partie de la map alors tu vas faire en sorte de pouvoir chopper que cette partie de la matrice
        • Si tu as 3 utilisateurs par semaine alors de toute façon tu vas passer tout ton temps en I/O vu que tu taperas pas dans ton cache VFS
        • Si tu as plein d'utilisateurs alors le bench mono utilisateur n'a aucun sens
        • Etc.

        Mais surtout si ton besoin c'est vraiment de stocker du 500x500 pour tes gamins pourquoi tu benchs ? T'as 250Ko à lire ! ~5 ms à froid pour le seek quoi que tu fasses et quelques dizaines/centaines de µs à chaud. Y'a rien à gagner ou à perdre avant d'avoir très très sérieusement scalé.

        Bref en règle générale:

        • Tu designs quelque chose de simple et élégant jusqu'à ça soit prouvé que c'est un problème
        • Les trucs simple et élégant qui fonctionnent bien se reposent souvent sur les concepts de l'OS. Tirer bêtement partie du cache VFS et d'un format de fichier adéquat te permettra déjà d'aller très loin.
        • [^] # Re: Mouais

          Posté par  . Évalué à 3.

          Je ne charge pas la map. Il n'y a pas de map, juste une grille de 25 000 cases dans laquelle on se balade et qui ne sert juste qu'à délimiter le monde et poser des villes. Pour le moment il n'y a pas d'images, mais je ne vais pas redire ce que j'ai déjà écrit, suffit juste de lire. J'ai l'impression de voir mes étudiants qui répondent au titre de la question sans avoir lu la question.

          Le but n'est pas de gagner ou de perdre, mais de tester, pour le fun. Si les gens ne faisaient que des trucs très sérieux, ce n'est plus les journaux que l'on mettrait en dépèche, mais les commentaires des question sur les forums.

          Mais promis, la prochaine fois je vous embêterais plus avec mes trucs et les garderais pour moi.

          • [^] # Re: Mouais

            Posté par  (site web personnel) . Évalué à 7.

            Mais promis, la prochaine fois je vous embêterais plus avec mes trucs et les garderais pour moi.

            Pour qu'il y ait une prochaine fois (Le langage ne m'interesse pas, mais la problématique et la démarche sont fun) : /usr/bin/time à la place du built-in time de ton shell.

            C'est un chouill' plus verbeux, et c'est souvent plus intéressant.

            Proverbe Alien : Sauvez la terre ? Mangez des humains !

          • [^] # Re: Mouais

            Posté par  . Évalué à 7. Dernière modification le 20 mars 2014 à 13:55.

            Je ne charge pas la map. Il n'y a pas de map, juste une grille de 25 000 cases dans laquelle on se balade et qui ne sert juste qu'à délimiter le monde et poser des villes. Pour le moment il n'y a pas d'images, mais je ne vais pas redire ce que j'ai déjà écrit, suffit juste de lire. J'ai l'impression de voir mes étudiants qui répondent au titre de la question sans avoir lu la question.

            Je sais lire et c'est ce qu'on appele une map puisque ca defini ton terrain.

            Basiquement une map c'est un fonction (x, y) => t qui te retourne le type de la case. Tu peux l'implémenter comme tu veux. Tu as choisi de la représenter par une matrice textuelle.

            Ta grille fait 250K cases, avec une représentation bête et méchante: un octet par case => 250K. Tu peux facilement faire ton estimation au dos d'une envelope à partir de ca. Tu compares ca au reste des coûts de ton chemin d'exécution complet en prod et par rapport à la "résolution" du client. Et tu arrives facilement à estimer si ca vaut le coup de faire autre chose que l'implémentation élégante.

            J'ai l'impression de voir mes étudiants qui répondent au titre de la question sans avoir lu la question.

            Merci.

            Le but n'est pas de gagner ou de perdre, mais de tester, pour le fun

            Ce qui est fun c'est de faire des choses qui ont un sens même si ca n'a absolument aucune utilité pratique. Autrement c'est juste faire n'importe quoi.

            La ton "benchmark" ne t'apprend rien de nouveau par rapport à un calcul au dos de l'envelope et ne mesure rien de significatif. La conclusion tu pouvais la connaitre avant de la faire:

            • Tu ne peux pas mesurer de cette facon des opérations estimées sous la ms
            • Le cout de lire 250K en cache VFS ou sur une DB locale n'est pas significatif par rapport au coup d'exécution de ton script
            • L'implémentation DB est stupide et ne se compare pas à la version fichier. Dans un cas tu caches ton dans ton espace d'adressage dans l'autre tu vas bourriner la DB à chaque requette. Soit l'implémentation est mauvaise, soit ton test n'a aucun sens
            • Tu ne peux absolument rien extrapoler de ces mesures. Une regle générale du benchmark est que ca suppose que connaitre ce que tu veux mesurer ainsi que le modèle de performance de ce qu'on mesure AVANT. J'ai appris quoi avec cette mesure ? Comment je peux l'extrapoler pour une grille NxN ou quand j'ai 1000 req/s ? Comment ca se traduit dans mon application ?
            • Si tu veux être rapide pour le fun commence avec une bonne structure et représentation des données.
            • [^] # Re: Mouais

              Posté par  . Évalué à 1.

              L'implémentation DB est stupide et ne se compare pas à la version fichier. Dans un cas tu caches ton dans ton espace d'adressage dans l'autre tu vas bourriner la DB à chaque requette. Soit l'implémentation est mauvaise, soit ton test n'a aucun sens

              ouais, sauf qu'en mode déconnecté, il est tout sauf certain que le fichier texte reste dans l'espace d'adressage et qu'il faille le relire à chaque fois. Mais plutôt que de refaire un bench stupide qui n'apprenne rien, tu le sais peut être ?

              Lorsque 2 personnes visitent une page à 2 secondes d'intervalles, le fichier reste en cache ou il ne l'est plus ? lorsque d'autres applications tournent sur la machine ?

              Et comme la base de donnée est aussi un fichier, il faut des 2 cotés lire un fichier, en mode texte on lit les 500 lignes, en mode base on lit une seule ligne. C'est quoi le plus rapide ?

              et c'est quoi la "bonne structure de représentation des données" ?

              • [^] # Re: Mouais

                Posté par  . Évalué à 5.

                ouais, sauf qu'en mode déconnecté, il est tout sauf certain que le fichier texte reste dans l'espace d'adressage

                Ce n'est pas le but.

                et qu'il faille le relire à chaque fois.

                Lire un fichier de 250K depuis le cache VFS ne coute "rien" que ce soit via l'API standard ou mmap.

                Si tu en est là, tu fais fausse route avec PHP et ton modèle d'exécution. Mais tu n'as pas de problème à résoudre.

                Lorsque 2 personnes visitent une page à 2 secondes d'intervalles, le fichier reste en cache ou il ne l'est plus ?

                Théoriquement tu ne peux pas savoir. Mais sauf a avoir un demon qui stock tes valeurs en memoire tu ne peux pas faire mieux. Et clairement ce n'est pas ce que tu veux et ca n'en vaudra jamais le coup.

                En pratique la reponse sera oui. Si tu n'utilises jamais ton appli alors tu as des chances qu'une éviction ait eu lieu et de faire un miss. Mais tu t'en balance car ca veut dire que tu as une requete / jour. Que ca prenne 5ms on s'en fou. De toute facon ton script PHP à aussi été dégager dans ce cas…

                Note que tu as le même problème avec une DB, et que tu n'as toujours pas de problème à résoudre.

                Et comme la base de donnée est aussi un fichier, il faut des 2 cotés lire un fichier, en mode texte on lit les 500 lignes, en mode base on lit une seule ligne. C'est quoi le plus rapide ?

                Ca depend de ton utilisation.

                C'est justement pour ca que ton test est pourri.

                D'une part tu ne définis rien. Vas tu requeter une seule fois ou souvent ? As tu besoins de seulement quelques valeurs ? Etc.

                D'autre part tes deux implementation n'ont rien de comparables. Ta version fichier elle est pratique si tu veux faire plein de requêtes sur une case en particulier. Ta version DB elle ne le permet pas. Tu compares des choux et des carottes. Quel est le but de la mesure au final ?

                et c'est quoi la "bonne structure de représentation des données" ?

                Ca demande de savoir comment tu vas utiliser et quel est le problème. Et vu que ton bench ne veut rien dire, qu'il n'y a pas de contexte et que les deux implementations divergent…

                • [^] # Re: Mouais

                  Posté par  . Évalué à 2.

                  j'ai une grille de 500x500 cases et on se déplace, lorsqu'on arrive sur une "case" il s'affiche une image, juste pour meubler l'écran. le type de cette image peut être stockée de différente manière :
                  - un fichier texte que je lis ligne à ligne pour trouver le bon x,y
                  - un array php ou chaque ligne est un x et le y est la position dans la chaine
                  - une table bdd ou chaque enregistrement est un x et le y est la position dans la chaine
                  - une image de x*y pixels ou la valeur est la couleur du pixel
                  -….

                  j'ai juste besoin de lire la valeur t correspondant à x,y - on est en client serveur, peu de connexions, même le truc le plus pourri, avec des objets java sur une base oracle passerait. Mon questionnement, sur un truc aussi simple est " variable php (dc 250Ko en ram) ou bdd et 1 seule ligne (5 ko) à lire. c'est juste de la curiosité.

                  Alors ce n'est pas palpitant certes, mais j'ai essayé de voir.

                  d'ailleurs une manière de générer la "matrice" est de faire une carte couleur pour arriver à une image de 250*250 puis de transformer les pixels en caractères.

                  • [^] # Re: Mouais

                    Posté par  . Évalué à 3.

                    j'ai juste besoin de lire la valeur t correspondant à x,y - on est en client serveur, peu de connexions, même le truc le plus pourri, avec des objets java sur une base oracle passerait. Mon questionnement, sur un truc aussi simple est " variable php (dc 250Ko en ram) ou bdd et 1 seule ligne (5 ko) à lire. c'est juste de la curiosité.

                    Je comprends parfaitement que tu cherches à le faire pour le fun.

                    Maintenant si tu veux une seule valeur alors essaies de faire des implémentation comparables. Si tu es basé sur un fichier ou un mmap, tu peux seeker directement à la bonne position par exemple. Ou être row based. A l'inverse en BDD tu peux retourner le blob entier ou faire un record par case. Mais si tu commences à mixer les implémentation sans raison ca limite encore l'intêret de la démarche.

                    Après les methodologies de mesure pour des choses <ms sont assez "compliqué" et demande de la rigeur. Enfin définir son critère de mesure est impératif: Que mesure ton, dans quel context, dans quel but. Sans ca l'intêret est extrêment limité d'autant plus quand tu peux savoir d'avance que l'ordre de grandeur est le même.

                    • [^] # Re: Mouais

                      Posté par  . Évalué à 3.

                      Mais si tu commences à mixer les implémentation sans raison ca limite encore l'intêret de la démarche.

                      je croyais que l'implémentation était équivalente :
                      - un tableau de 500 ligne en php,
                      - une base de 500 enregistrement en mysql

                      • var[$x][y] en php
                      • susbstring (data, $y,1) where id=x en mysql.

                      Qu'ai-je loupé ?

    • [^] # Re: Mouais

      Posté par  . Évalué à 7.

      je sais qu'ici, il y a tout plein de gens très sérieux dont les compétences sauvent le monde, mais pour faire un testounet de 10 lignes qui m'a pris plus de temps à mettre en forme qu'a monter, je n'ai pas cherché le marteau pilon.

      Parce que je suis persuadé que sur une grid de 1000 coeurs avec le bon ordonnanceur, avec une table en ram… on pourrait faire encore mieux, mais je suis sur une vieille machine et je suis sur du code qui existe déja et que ne veux pas y passer plus de temp.

      Moi je n'aime pas l'objet lorsque je suis en non connecté, cela me semble, au niveau exécution, une hérésie.

      • [^] # Re: Mouais

        Posté par  . Évalué à 3.

        Concernant l'utilisation de la POO dans ce contexte:

        1. Dans le cadre de ton test, effectivement, le procédural convient parfaitement, et faire plus juste parce que l'objet c'est bôôôôôô, c'est ridicule
        2. En règle générale, dans les langages interprétés (Perl, Ruby, PHP, etc.), l'utilisation d'objets a réellement un impact négatif sur les performances

        De plus, et ça ce n'est que mon opinion, critiquer la façon de coder (objet, procédural, fonctionnel, blah) à tout prix est ridicule, surtout si on n'est pas impliqué dans le développement en lui-même. L'important c'est que le boulot soit fait. C'est la première règle. Une règle optionnelle, c'est que le boulot soit bien fait, et donc qu'on puisse le reprendre facilement. La POO peut aider, mais ce n'est pas toujours le cas, car écrire correctement un programme orienté objet nécessite de ne pas perdre la boule et ajouter 2000 classes juste parce qu'on suit un dogme « POO partout » (et potentiellement, performance nulle part…).

        Bref.

  • # Format?

    Posté par  (site web personnel) . Évalué à 4.

    Tu devrais générer la carte dans un format pour un éditeur comme Tiled. Ca te permettra de la retoucher et d'ajouter des métadonnées.

    Le post ci-dessus est une grosse connerie, ne le lisez pas sérieusement.

    • [^] # Re: Format?

      Posté par  . Évalué à 0.

      heu… marteau-pilon vs mouche ?

      • [^] # Re: Format?

        Posté par  . Évalué à 8.

        Clairement, pourquoi s'emmerder à utiliser une visseuse électrique pour visser, alors que la nature nous a déjà donné des ongles?

        • [^] # Re: Format?

          Posté par  . Évalué à 3.

          Clairement, pourquoi s'emmerder à utiliser un marteau alors qu'en construisant un barrage, tirant des lignes à haute tension et en empruntant la visseuse du voisin, ca va tellement plus vite pour enfoncer un clou.

  • # Commentaire supprimé

    Posté par  . Évalué à 9.

    Ce commentaire a été supprimé par l’équipe de modération.

    • [^] # Re: Consommation mémoire...

      Posté par  . Évalué à 2.

      Effectivement si tu veux mimiser la conso mémoire et gagner 250K par instance, tu mmap directement ta matrice définie dans un fichier. Au passsage ca enlève la limite à 80 caractère et tu ne peux pas avoir un accès moins couteux à une cellule. Par sur que tu puisses mmap en PHP par contre.

  • # Génération

    Posté par  (Mastodon) . Évalué à 3.

    Il faut bien entendu générer cette matrice" mais c'est un autre problème.

    Pour ça, je te conseille un petit article qui contient quelques idées d'algos pour générer tes montagnes.

    Pour le reste, j'aimerais savoir si l'idée est de générer une carte une bonne fois pour toute ou alors si tu génères des cartes en ligne. Parce que dans le premier cas, en fait, ce n'est pas si grave que ce soit lent (et quand je dis lent, je parle de truc de l'ordre de la seconde voire, dans le pire des cas, de la minute). Dans le second cas, oui c'est intéressant de regarder. Et si tu es dans le premier cas, tu pourrais sans doute essayer sqlite, parce que ta carte va rester constante a priori au cours du jeu, donc tu n'auras pas de problème d'écritures concurrentes.

    • [^] # Re: Génération

      Posté par  . Évalué à 4.

      alors…

      pour le moment le truc que j'ai exhumé n'utilise pas de carte, juste une grille "vide" avec quelques villes posées dessus.
      pour le moment je ne cherche qu'à mettre des images "fixes" pour agrémenter la page en question. Ce qui veut dire, que pour le moment, le contenu de la carte importe peu que ce soit une image de montagne ou de plaine ou de désert ne changera rien du tout au jeu, mon objectif est plutôt d'ajouter, rapidement (en peu de temps, J'ai ajouté des images pour les monstres et les villes en moins de 15 minutes, en partant d'un code que je connaissais pas.) et avec peu de lignes,
      - la possibilités de se croiser à plusieurs sur la "carte" (2 personnes au même endroit, peu importe ou) et de se parler.
      - la possibilité de faire des missions.
      - Des pnj.

      Ce système de matrice texte est assez simple à mettre en oeuvre, il ne sert qu'à mettre des images (et je ne veux pas d'images aléatoires, pour avoir la même image lorsque je reviens sur la même case.) Je sais qu'avec ce système, je suis limité à environs 80 type d'images, mais je survivrais.

      Enfin, je ne veux rien de plus que j'utilise déja. Pour la "création" de la carte, j'avais déjà fait un truc en python qui est déjà utilisé par les futurs utilisateurs de cette maigre évolution d'un rpg existant et qui est capable d'écrire ce que j'attends de lui. J'ai trouvé des tuiles (disons pas loin de 8000) que je peux utiliser librement quelque soit le contexte et qui permettrons de fabriquer, ET la map world ET les images de chaque type de case.

      Je n'attends rien de plus et je ne veux pas y passer des heures : l'objectif est de donner à mes gamins la possibilité d'être acteur de leur jeux et de pouvoir y jouer en ligne avec 2 ou 3 potes. Cela durera probablement 3 mois de mise en place du jeux (car le paramétrage peut se faire par eux en mode web, directement sur le serveur) et 3 mois de jeux avant de passer à autre chose, ou pas.

      C'est, à mon avis, cela l'esprit du libre : trouver un bout de code, l'adapter pour faire ce que l'on a envie/besoin (et le donner si un autre le veut). Maintenant c'est sûrement pas élégant au niveau code, probablement pas très smart au niveau de ce que l'on pourrait faire, mais ce sera fait en moins de 15 jours, à temps perdu (peu), ca tournera sur une machine déjà en place et c'est l'objectif.

      J'ai lu avec attention tes épisodes sur la création d'un jeu, c'est super intéressant mais à des années lumières des objectifs que je me suis fixé pour cette fois.

      • [^] # Re: Génération

        Posté par  . Évalué à 5.

        Salut,
        je pense qu'en general les gens ont bien compris la philosohpie derriere tout ca, les remarques qui sont faites ici le sont surtout de maniere generale, pour quiconque serait interessé par un projet equivalent (même si ces remarques te sont adressé personnelement, ce n'est finalement qu'une question de forme…)
        Il y a des points interessant non pas uniquement pour celui qui expose ses bench mais pour divers lecteurs de ce post.

        Parmi ceux qui repondent ainsi que ceux qui ne laisserons pas de trace ici, il y en a qui comprennent ta demarche.

        En tout cas, va-y fonce!

        Est-ce qu'il sera possible de voir le resultat final ? ou d'en avoir les sources pour que l'on puisse l'essayer ?
        Perso ca m'interesse… (avec ou sans base de données :P )

  • # pas compris ton bench

    Posté par  . Évalué à 1.

    Car il ne se positionne dans aucun cas concret. Enfin si, la génération d'1 map, 1 fois, sans concurrence.
    Partant du principe que tu écris en php, je suppose, site web, je suppose donc multi utilisateur.
    Je me demande si la table est en lecture / écriture permanente, ou pas.

    Autrement, le make du fichier.php pourrait être écris ainsi,

    <?php
    `{mathjax} ta_matrice=array();for(`i=0;`{mathjax} i<0;`i++) $ta_matrice[]="id image0000";
    file_put_contents("fichier_a_inclure.php","<?php return ".var_export($ta_matrice,true).";");
    

    Qui donc génère un tableau php véritable, l'exporte en code php compatible via var_export, concatène le résultat avec un return et un point-virgule, puis écris finalement l'ensemble dans un fichier php itself.

    Tu peux ensuite te contenter d'un bête :

    <?php $ma_matrice_pre_generee = include("fichier_a_inclure.php");
    

    pour lire ta matrice.

    Puis quitte à faire dans le pet de mouche, évite les balises php fermante si ton code n'est pas mixé avec du html.
    Cela peut t'éviter pleins de problèmes potentiels extrêmement bizarre à debugger pour un non avertit.

    PS : le parseur MD est total buggé les amis. il confond php et math…

    • [^] # Re: pas compris ton bench

      Posté par  . Évalué à 2.

      non c'est la lecture d'une position dans une map le truc. La génération de la map c'est juste pour donner les outils pour refaire le test.

Suivre le flux des commentaires

Note : les commentaires appartiennent à celles et ceux qui les ont postés. Nous n’en sommes pas responsables.