Bonjour à tous,
Alors après plusieurs tests, voici les résultats...
Tout d'abord les fonctions utilisées:
<?php
function t1($text){
// récupération du nombre d'argument
$numargs = func_num_args();
// si un seul argument
// simple retour de la traduction
if($numargs == 1){
return _($text);
}
// sinon on utilise sprintf
else {
$args = func_get_args();
$args[0]=_($args[0]);
return call_user_func_array('sprintf',$args);
}
}
/*
t1('youpi');
t1('1:%s 2:%s','foo','bar');
*/
function t2($text, Array $params = array()){
$text = _($text);
if(!empty($params)){
$keys = array_keys($params);
$search = array();
foreach ($keys as $element) {
$search[] = '{' . $element . '}';
}
$text = str_replace($search,$params,$text);
}
return $text;
}
/*
t2('blablabla');
t2('Bonjour {username}, you are {adjectif}',array('username'=>'paul','adjectif'=>'beautiful'));
*/
Et le fichier de test:
<?php
// bench sur les méthodes!
$nb_iterations = 10000;
echo '<h1>Méthode sprintf + _()</h1><div style="height:100px;overflow:auto">';
$start = microtime(true);
for($i = 0; $i < $nb_iterations;$i++){
echo sprintf(_("Bienvenue %s!"),'Paul');
echo _("Youpla Boum!");
echo sprintf(_("You are so %s!"),'beautiful');
echo sprintf(_("Lorem Elsass ipsum réchime Pfourtz !
quam. %s Mauris auctor, nullam tristique bissame eleifend %s commodo libero.
lotto-owe dolor messti de Bischheim chambon porta elit geht's schneck
Christkindelsmärik Verdammi %s yeuh. dignissim gravida semper Chulia
Roberstau non kougelhopf hop ante geïz wurscht ac sagittis ornare
rhoncus sit hopla hopla sed tellus mollis Huguette mamsell vulputate
gewurztraminer Gal. amet munster Heineken Salu %s bissame dui schnaps
blottkopf, amet varius morbi ftomi! placerat lacus leo quam, in,
Wurschtsalad kartoffelsalad risus, ch'ai bredele aliquam Hans
leverwurscht merci %s vielmols ornare Gal ! Chulien condimentum nüdle
knepfle %s vielmols, habitant Coopé de Truchtersheim Oberschaeffolsheim
salu jetz gehts los libero, hopla purus Carola Strasbourg %s Salut
bisamme météor rucksack %s id, gal Spätzle leo consectetur libero,
picon bière so adipiscing tellus hoplageiss non s'guelt amet,
sed rossbolla schpeck Racing. baeckeoffe Kabinetpapier turpis,
suspendisse tchao %s bissame und turpis wie Richard Schirmeck
Pellentesque barapli hopla sit kuglopf Miss Dahlias Yo dû.
ullamcorper %s knack elementum et sit senectus eget pellentesque
flammekueche Morbi id ac Oberschaeffolsheim mänele DNA, ."),
1,2,3,4,5,6,7,8,9,10);
}
$end = microtime(true);
echo '</div><hr />';
$time_1 = $end - $start;
echo '<h1>Méthode t1</h1><div style="height:100px;overflow:auto">';
$start = microtime(true);
for($i = 0; $i < $nb_iterations;$i++){
echo t1("Bienvenue %s!",'Paul');
echo t1("Youpla Boum!");
echo t1("You are so %s!",'beautiful');
echo t1("Lorem Elsass ipsum réchime Pfourtz !
quam. %s Mauris auctor, nullam tristique bissame eleifend %s commodo libero.
lotto-owe dolor messti de Bischheim chambon porta elit geht's schneck
Christkindelsmärik Verdammi %s yeuh. dignissim gravida semper Chulia
Roberstau non kougelhopf hop ante geïz wurscht ac sagittis ornare
rhoncus sit hopla hopla sed tellus mollis Huguette mamsell vulputate
gewurztraminer Gal. amet munster Heineken Salu %s bissame dui schnaps
blottkopf, amet varius morbi ftomi! placerat lacus leo quam, in,
Wurschtsalad kartoffelsalad risus, ch'ai bredele aliquam Hans
leverwurscht merci %s vielmols ornare Gal ! Chulien condimentum nüdle
knepfle %s vielmols, habitant Coopé de Truchtersheim Oberschaeffolsheim
salu jetz gehts los libero, hopla purus Carola Strasbourg %s Salut
bisamme météor rucksack %s id, gal Spätzle leo consectetur libero,
picon bière so adipiscing tellus hoplageiss non s'guelt amet,
sed rossbolla schpeck Racing. baeckeoffe Kabinetpapier turpis,
suspendisse tchao %s bissame und turpis wie Richard Schirmeck
Pellentesque barapli hopla sit kuglopf Miss Dahlias Yo dû.
ullamcorper %s knack elementum et sit senectus eget pellentesque
flammekueche Morbi id ac Oberschaeffolsheim mänele DNA, .",
1,2,3,4,5,6,7,8,9,10);
}
$end = microtime(true);
echo '</div><hr />';
$time_2 = $end - $start;
echo '<h1>Méthode t2</h1><div style="height:100px;overflow:auto">';
$start = microtime(true);
for($i = 0; $i < $nb_iterations;$i++){
echo t2("Bienvenue {username}!",array('username'=>'Paul'));
echo t2("Youpla Boum!");
echo t2("You are so {adj}!",array('adj'=>'beautiful'));
echo t2("Lorem Elsass ipsum réchime Pfourtz !
quam. {1} Mauris auctor, nullam tristique bissame eleifend {2} commodo libero.
lotto-owe dolor messti de Bischheim chambon porta elit geht's schneck
Christkindelsmärik Verdammi {3} yeuh. dignissim gravida semper Chulia
Roberstau non kougelhopf hop ante geïz wurscht ac sagittis ornare
rhoncus sit hopla hopla sed tellus mollis Huguette mamsell vulputate
gewurztraminer Gal. amet munster Heineken Salu {4} bissame dui schnaps
blottkopf, amet varius morbi ftomi! placerat lacus leo quam, in,
Wurschtsalad kartoffelsalad risus, ch'ai bredele aliquam Hans
leverwurscht merci {5} vielmols ornare Gal ! Chulien condimentum nüdle
knepfle {6} vielmols, habitant Coopé de Truchtersheim Oberschaeffolsheim
salu jetz gehts los libero, hopla purus Carola Strasbourg {7} Salut
bisamme météor rucksack {8} id, gal Spätzle leo consectetur libero,
picon bière so adipiscing tellus hoplageiss non s'guelt amet,
sed rossbolla schpeck Racing. baeckeoffe Kabinetpapier turpis,
suspendisse tchao {9} bissame und turpis wie Richard Schirmeck
Pellentesque barapli hopla sit kuglopf Miss Dahlias Yo dû.
ullamcorper {10} knack elementum et sit senectus eget pellentesque
flammekueche Morbi id ac Oberschaeffolsheim mänele DNA, .",
array('1'=>1,'2'=>2,'3'=>3,'4'=>4,'5'=>5,'6'=>6,'7'=>7,'8'=>8,'9'=>9,'10'=>10));
}
$end = microtime(true);
echo '</div><hr />';
$time_3 = $end - $start;
echo '<p>Nb itérations: '.$nb_iterations.'<br />sprintf() + _() : '.$time_1.
'<br />t1() : '.$time_2.
'<br />t2() : '.$time_3.'</p>';
Les résultats:
Code : Tout sélectionner
Nb itérations: 10
sprintf() + _() : 0,00078296661377
t1() : 0,00163102149963
t2() : 0,00156879425049
Nb itérations: 100
sprintf() + _() : 0,0076539516449
t1() : 0,0168409347534
t2() : 0,0158441066742
Nb itérations: 1000
sprintf() + _() : 0,0772478580475
t1() : 0,165311098099
t2() : 0,157105922699
Nb itérations: 10000
sprintf() + _() : 0,798131942749
t1() : 1,6633169651
t2() : 1,55909395218
Comme vous pouvez le constater, j'ai utiliser trois courts textes avec peut de variables à insérer ou pas du tout.
Et un texte un peu plus conséquent avec 10 variables à insérer...
Les résultats sont bien sûr en faveur de la première méthode qui n'utilise aucune surcouche... mais je l'écarte pour cause d'illisibilité!
Je pensais que la deuxième méthode passerait devant, mais en fait l'utilisation de call_user_func_array() semble lui porter préjudice... Si vous avez une idée de comment combiner l'appel à sprintf() et l'utilisation du nombre d'argument variable (fun_get_args), sans passer par cette dernière, je suis preneur!
Au final, en terme d'utilisabilité, il serait peut-être judicieux de combiner la première et la deuxième méthode, afin d'être plus souple... mais les performances vont peut-être en pâtir...
Votre avis?