comparatif vitesse strtr(), str_replace() et preg_replace() [PHP] - PHP - Programmation
Marsh Posté le 28-11-2002 à 17:58:56
thx pour cette petite étude
les perfs de str_replace augmentent sur un texte comportant plusieurs fois la même valeur à remplacer.
A savoir aussi : un remplacement de tag (uniformes) dans un texte long est encore plus performant en appliquant un algorithme de découpage en tableau du texte.
ex :
"voici un texte contenant des {TIG} et encore des {TAG}, puis des {TOG}"
après découpage en tableau avec explode() on obtient dans le tableau :
$tab[0]['str']= 'voici un texte contenant des ';
$tab[0]['key']= 'TIG';
$tab[1]['str']= ' et encore des ';
$tab[1]['key']= 'TAG';
$tab[2]['str']= ', puis des ';
$tab[2]['key']= 'TOG';
dans un autre tableau à accès par clé, on a les valeurs à remplacer:
$replace['TIG']= 'un tag';
$replace['TAG']= 'un tag 2';
$replace['TOG']= 'un tag 3';
on remplace en parcourant le tableau contenant le texte
for ($i=0, $max= count($tab); $i<$max; $i++){
$texte.= $tab[$i]['str']. $replace[$tab[$i]['key']];
//on peut aussi décider de ce qui sera fait avec les clés non trouvées
}
ça arrache bien surtout si le texte est grand (voir les système de templates les plus performants).
Marsh Posté le 28-11-2002 à 18:07:03
Freekill a écrit a écrit : Salut, J'espère que vous trouverez ça utile? |
En effet, c'est bien sympa
Marsh Posté le 28-11-2002 à 18:15:41
Bah un joli chart ca fait tjs plaisir pour comparer, continue seulement
Marsh Posté le 28-11-2002 à 18:22:47
chacal_one333 a écrit a écrit : en clair strtr is the best |
plus rapide ne veut pas dire le meilleur, sinon les autres ne seraient pas la
les expressions regulieres c'est bien pratique, même si dans ce cas c'est la solution la plus lente.
Marsh Posté le 28-11-2002 à 18:27:40
lorill a écrit a écrit : plus rapide ne veut pas dire le meilleur, sinon les autres ne seraient pas la les expressions regulieres c'est bien pratique, même si dans ce cas c'est la solution la plus lente. |
toute info est bonne a prendre
Marsh Posté le 28-11-2002 à 18:30:29
Par contre j'ai un doute la... strtr c'est pour remplacer un char par un autre, donc comment tu remplacer par une img avec ca?
Ou alors j'ai mal lu la doc
http://www.php.net/strtr
Non
Marsh Posté le 28-11-2002 à 18:36:26
C'est sûr que pour faire des remplacement simples, les expressions régulières font un peu GROSSE CAVALERIE.
Cela dit, je ne pensait pas que preg_replace() serait si mal placée. Mais c'est sans doute en grande partie due au fait qu'avec preg_replace() t'est obligé de boucler en php sur le tableau.
Marsh Posté le 28-11-2002 à 18:38:13
Zion a écrit a écrit : Par contre j'ai un doute la... strtr c'est pour remplacer un char par un autre, donc comment tu remplacer par une img avec ca? Ou alors j'ai mal lu la doc http://www.php.net/strtr Non |
Si, tu peut ne passer que 2 argument dont le 2ème est un tableau des remplacement à faire, non pas sur des char simple mais sur des strings !
C'est pour çà qu'strtr() est si rapide. Un seul appel suffit.
Marsh Posté le 28-11-2002 à 18:52:15
Mara's dad a écrit a écrit : Si, tu peut ne passer que 2 argument dont le 2ème est un tableau des remplacement à faire, non pas sur des char simple mais sur des strings ! C'est pour çà qu'strtr() est si rapide. Un seul appel suffit. |
Ah oki
Marsh Posté le 28-11-2002 à 18:52:37
perso je vois pas l'intêret de faire un comparo de fonctions qui n'ont à priori pas le même but..
ça semble limpide que les regexp sont utiles uniquement pour des règles de remplacement / recherche un minimum complexe, ce qui explique leurs performances
pour un remplacement simple str_replace() et strtr() sont déjà plus étudièes
Marsh Posté le 29-11-2002 à 12:31:16
pour ceux que ça interesse, j'avais aussi fait kks tests de perfs sur d'autres fonctions.
D'une part sur la tokenization d'une chaine de caracteres, et d'autre part sur le trim :
|
testé avec php 4.3.0rc2, le test tourne 500K fois et le temps indiqué est en secondes.
Marsh Posté le 29-11-2002 à 12:43:40
six_dfx a écrit a écrit : pour ceux que ça interesse, j'avais aussi fait kks tests de perfs sur d'autres fonctions. D'une part sur la tokenization d'une chaine de caracteres, et d'autre part sur le trim :
|
Ouais OK, m'enfin les chaînes sur lesquelles tu fais explode() ou strtok(), elles sont longues de combien de caractères ? Et quel est le délimiteur ? Et y a combien d'occurrences du délimiteur ?
Pis sinon, pourquoi t'as pas testé split() ?
Idem pour les trim(), quelle est le type de chaîne, y a combien d'espaces en début, en fin, etc...
Marsh Posté le 29-11-2002 à 12:44:53
Sh@rdar a écrit a écrit : perso je vois pas l'intêret de faire un comparo de fonctions qui n'ont à priori pas le même but.. ça semble limpide que les regexp sont utiles uniquement pour des règles de remplacement / recherche un minimum complexe, ce qui explique leurs performances pour un remplacement simple str_replace() et strtr() sont déjà plus étudièes |
Pour voir si les avantages valent la perte de vitesse.
Par exemple preg_replace()est la seule qui permet de limiter le nombre de remplacements effectués, les autres sont case sensitive, etc.
De plus je disposais d'assez peu d'infos sur les perfs de strtr(), surtout depuis que cette fonction accepte les arrays comme arguments.
Marsh Posté le 29-11-2002 à 12:51:38
bin justement non, puisque logiquement, ton choix de fonction se fait avant tout sur ta règle de remplacement dont tu as besoin
faudrait mieux comparer les regexp avec ou sans case sensitive, et les fonctions strXXX selon la longueur du remplacement à effectuer, ça serait déjà plus parlant..
Marsh Posté le 29-11-2002 à 12:54:26
Sh@rdar a écrit a écrit : faudrait mieux comparer les regexp avec ou sans case sensitive, et les fonctions strXXX selon la longueur du remplacement à effectuer, ça serait déjà plus parlant.. |
je t'en prie?
Marsh Posté le 29-11-2002 à 13:04:37
six_dfx a écrit a écrit :
|
comment tu as fait ton test ?
strtok() a bien été exécuté x fois pour obtenir le même tableau que celui obtenu par 1 explode() ?
si oui, je crois que je vais modifier mon générateur de templates...
Marsh Posté le 29-11-2002 à 14:57:02
Taiche a écrit a écrit : Ouais OK, m'enfin les chaînes sur lesquelles tu fais explode() ou strtok(), elles sont longues de combien de caractères ? Et quel est le délimiteur ? Et y a combien d'occurrences du délimiteur ? Pis sinon, pourquoi t'as pas testé split() ? Idem pour les trim(), quelle est le type de chaîne, y a combien d'espaces en début, en fin, etc... |
J'ai fait tous les tests sur les mêmes chaines (délim = ":", longueur dans les 50 bytes, 2 tokens donc 1 occurence du délimiteur, peut etre que explode est + interessant quand on monte en nombre de tokens)
split est un alias pour explode() il me semble c'est la raison pour laquelle je l'ai laissé de côté ...
[citation]
comment tu as fait ton test ?
strtok() a bien été exécuté x fois pour obtenir le même tableau que celui obtenu par 1 explode() ?
[/citation]
oui, 2 appels a strtok contre 1 a explode()
Marsh Posté le 29-11-2002 à 14:58:04
six_dfx a écrit a écrit : split est un alias pour explode() il me semble c'est la raison pour laquelle je l'ai laissé de côté ... |
split() gère les regexp, pas explode()
Marsh Posté le 29-11-2002 à 15:00:07
Sh@rdar a écrit a écrit : split() gère les regexp, pas explode() |
ooops ...
confondu avec join() et implode()
Marsh Posté le 29-11-2002 à 15:02:46
six_dfx a écrit a écrit : J'ai fait tous les tests sur les mêmes chaines (délim = ":", longueur dans les 50 bytes, 2 tokens donc 1 occurence du délimiteur, peut etre que explode est + interessant quand on monte en nombre de tokens) split est un alias pour explode() il me semble c'est la raison pour laquelle je l'ai laissé de côté ... oui, 2 appels a strtok contre 1 a explode() |
Effectivement, je pense qu'il serait bon d'augmenter le nombre de tokens. Genre 6 ou 7, ça commencerait à être bien représentatif. Non pas que je sois un fervent admirateur de la fonction explode() mais c'est juste pour avoir des résultats pertinents
D'ailleurs, si t'as pas le temps de faire les tests, j'peux les faire, faut juste me dire
Marsh Posté le 29-11-2002 à 15:11:58
Si ça interesse quelqu'un qui voudrait lui aussi un bon moyen de tester les perfs de diverses fonctions php, voila comment j'ai procédé :
Code :
|
Marsh Posté le 28-11-2002 à 16:32:42
Salut,
Voilà, je me suis fait un petit comparatif de ces trois fonctions afin de déterminer laquelle serait la plus appropriée à l'usage que je voulais en faire.
J'ai pensé que les résultats pourraient en intéresser d'autres, alors je vous les mets ici.
Le texte utilisé était composé de
, qui devaient être transformés en tags <img> affichant le smiley correspondant. (comme c'est original )
L'array de recherche/remplacement comportait 45 éléments.
Le test a été réalisé avec plusieurs taille de texte et un nombre différent de passes sur le texte (qui restait inchangé).
Il a été exécuté 100 fois et les valeurs que vous voyez dans le graphique sont les moyennes obtenues.
J'espère que vous trouverez ça utile?
---------------
Faux & usage de faux ¤ Machins roses ¤ ASCIImage ¤ HFR Enhance v0.8.6