Bonjour,
je voulais qu'on discute ensemble d'un sujet sur lequel je travail en ce moment, à savoir la gestion du cache pour des données globale au jeu, exemple: j'ai un tableau qui contient la liste des couts de chaque action du jeu.
Donc j'ai tester les différents moyens de stocker et de récupérer ces données et nottament au niveau des cache : APC, memcache et memcached.
Je partage ici les résultats, on pourra discuter des conclusions et si quelqu'un a mieux à proposer...
Note 1: les temps ici ne sont pas divisé par le nombre de boucle, il s'agit juste du cumule du temps, sauf pour les tests de temps d'inclusion de fichier ou de connexion au serveur memcache qui eux sont divisé par le nb de boucle (puisqu'il n'y a généralement qu'une connexion nécessaire)
Note 2: les méthodes 1 et 2 ont été réalisé avec la mise en cache de l'opcode avec APC.
Note 3: il s'agit de résultat obtenu non pas en local mais avec mon serveur en ligne où Dévotion est héberger.
Note 4: certains tests sont dans des while différents pour limité les effets de bords (après plusieurs tests, je me suis rendu compte que si je met tout dans la même boucle, certains résultat sont ralenti...)
Note 5: il s'agit de résultat obtenu non pas en local mais avec mon serveur en ligne où Dévotion est héberger.
CODE utilisé pour le test:
avec data.php :
test_include.php étant un fichier vide.
j'utilise PHP 5.4 (d'où l'absance de "array()")
function floatalize() => http://www.jeuweb.org/showthread.php?tid...0#pid95650
Résultats :
Conclusions:
Postulat: la mise en cache ne se fait qu'une fois et n'est actualise que rarement lors de mise à jours.
Donc ce qui importe ce n'est pas le "set" met le fait de "get" une variable.
Résumé des résultats dans l'ordre:
Il y a donc environ un facteur 100 entre la variable static et memcache !
On remarque également que l'inclusion d'un fichier (dont l'opcode est caché) est plus rapide (0.000010960853099823), lui meme plus rapide que le require (0.000026363780498505) que la connexion au serveur de memcached (0.00060304543018341) mais pas de memcache (0.000079657964706421).
Il faut aussi savoir que memcache à la différence d'APC est taillé pour une archi distribué (quand votre infrastructure est dispatché entre plusieurs serveurs), là où APC semble atteindre sa limite.
je voulais qu'on discute ensemble d'un sujet sur lequel je travail en ce moment, à savoir la gestion du cache pour des données globale au jeu, exemple: j'ai un tableau qui contient la liste des couts de chaque action du jeu.
Donc j'ai tester les différents moyens de stocker et de récupérer ces données et nottament au niveau des cache : APC, memcache et memcached.
Je partage ici les résultats, on pourra discuter des conclusions et si quelqu'un a mieux à proposer...
Note 1: les temps ici ne sont pas divisé par le nombre de boucle, il s'agit juste du cumule du temps, sauf pour les tests de temps d'inclusion de fichier ou de connexion au serveur memcache qui eux sont divisé par le nb de boucle (puisqu'il n'y a généralement qu'une connexion nécessaire)
Note 2: les méthodes 1 et 2 ont été réalisé avec la mise en cache de l'opcode avec APC.
Note 3: il s'agit de résultat obtenu non pas en local mais avec mon serveur en ligne où Dévotion est héberger.
Note 4: certains tests sont dans des while différents pour limité les effets de bords (après plusieurs tests, je me suis rendu compte que si je met tout dans la même boucle, certains résultat sont ralenti...)
Note 5: il s'agit de résultat obtenu non pas en local mais avec mon serveur en ligne où Dévotion est héberger.
CODE utilisé pour le test:
$timer['timer_global'] = microtime(true);
require_once 'data.php';
require_once 'data_class.php';
$memcached = new Memcached();
$memcached->addServer('localhost', 11211);
$mc = new Memcache();
$mc->addServer('localhost', 11211);
$i=0;
$timer['nb'] = 100000;
while($i<$timer['nb'])
{
$t = microtime(true);
$GLOBALS['test_data_file']['titi'];
$timer['globals_var'] += microtime(true) - $t;
$t = microtime(true);
Toto::$data['titi'];
$timer['static_var_in_class'] += microtime(true) - $t;
$i++;
}
$i=0;
while($i<$timer['nb'])
{
$t = microtime(true);
apc_store('test_de_perf_apc', ['toto', 42]);
$timer['apc']['set'] += microtime(true) - $t;
$t = microtime(true);
apc_fetch('test_de_perf_apc');
$timer['apc']['get'] += microtime(true) - $t;
$t = microtime(true);
$memcached->set('test_de_perf_mem', ['toto', 42]);
$timer['memcached']['set'] += microtime(true) - $t;
$t = microtime(true);
$memcached->get('test_de_perf_mem');
$timer['memcached']['get'] += microtime(true) - $t;
$t = microtime(true);
$mc->set('test_de_perf_mem2', ['toto', 42]);
$timer['memcache']['set'] += microtime(true) - $t;
$t = microtime(true);
$mc->get('test_de_perf_mem2');
$timer['memcache']['get'] += microtime(true) - $t;
$i++;
}
$i=0;
while($i<$timer['nb'])
{
$t = microtime(true);
$memcached = new Memcached();
$memcached->addServer('localhost', 11211);
$timer['memcached']['connect'] += microtime(true) - $t;
$t = microtime(true);
$mc = new Memcache();
$mc->addServer('localhost', 11211);
$timer['memcache']['connect'] += microtime(true) - $t;
$t = microtime(true);
require 'test_include.php';
$timer['require_file'] += microtime(true) - $t;
$t = microtime(true);
include 'test_include.php';
$timer['include_file'] += microtime(true) - $t;
$i++;
}
$timer['include_file'] = floatalize($timer['include_file']/$timer['nb']);
$timer['require_file'] = floatalize($timer['require_file']/$timer['nb']);
$timer['memcached']['connect'] = floatalize($timer['memcached']['connect']/$timer['nb']);
$timer['memcache']['connect'] = floatalize($timer['memcache']['connect']/$timer['nb']);
$timer['timer_global'] = microtime(true) - $timer['timer_global'];
var_dump($timer);
avec data.php :
<?php
$GLOBALS['test_data_file'] = ['titi' => 42, 'tralala' => 2];
et avec data_class.php :<?php
class Toto
{
static $data = ['titi' => 42, 'tralala' => 2];
}
test_include.php étant un fichier vide.
j'utilise PHP 5.4 (d'où l'absance de "array()")
function floatalize() => http://www.jeuweb.org/showthread.php?tid...0#pid95650
Résultats :
Code :
array(9) {
["timer_global"]=>
float(132.59713315964)
["nb"]=>
int(100000)
["globals_var"]=>
float(0.141921043396)
["static_var_in_class"]=>
float(0.1264328956604)
["apc"]=>
array(2) {
["set"]=>
float(1.3067555427551)
["get"]=>
float(0.51916360855103)
}
["memcached"]=>
array(3) {
["set"]=>
float(13.609169960022)
["get"]=>
float(11.365718603134)
["connect"]=>
string(19) "0.00060304543018341"
}
["memcache"]=>
array(3) {
["set"]=>
float(15.925793886185)
["get"]=>
float(14.207545518875)
["connect"]=>
string(20) "0.000079657964706421"
}
["require_file"]=>
string(20) "0.000026363780498505"
["include_file"]=>
string(20) "0.000010960853099823"
}
Conclusions:
Postulat: la mise en cache ne se fait qu'une fois et n'est actualise que rarement lors de mise à jours.
Donc ce qui importe ce n'est pas le "set" met le fait de "get" une variable.
Résumé des résultats dans l'ordre:
Citation ://méthode #2
["static_var_in_class"]=> 0.1264328956604
//méthode #1
["globals_var"]=> 0.141921043396
//méthode #5
["apc"]=> 0.51916360855103
//méthode #3
["memcached"]=> 11.365718603134
//méthode #4
["memcache"]=> 14.207545518875
Il y a donc environ un facteur 100 entre la variable static et memcache !
On remarque également que l'inclusion d'un fichier (dont l'opcode est caché) est plus rapide (0.000010960853099823), lui meme plus rapide que le require (0.000026363780498505) que la connexion au serveur de memcached (0.00060304543018341) mais pas de memcache (0.000079657964706421).
Il faut aussi savoir que memcache à la différence d'APC est taillé pour une archi distribué (quand votre infrastructure est dispatché entre plusieurs serveurs), là où APC semble atteindre sa limite.
Dévotion, jeu multijoueur gratuit par navigateur de stratégie et de conquête
The Magic Institute, le jeu de magie médieval fantastique gratuit en ligne
Rapture Studio : créateur de divertissement pour tous
JePolitique.fr - débattons ensemble
JécrisLaConstitution.fr - ne laissons pas les Hommes aux pouvoirs écrire les règles du pouvoir
Je Deviens Citoyen (Association à but non lucratif)
The Magic Institute, le jeu de magie médieval fantastique gratuit en ligne
Rapture Studio : créateur de divertissement pour tous
JePolitique.fr - débattons ensemble
JécrisLaConstitution.fr - ne laissons pas les Hommes aux pouvoirs écrire les règles du pouvoir
Je Deviens Citoyen (Association à but non lucratif)