strlen vs mb_strlen.. Tanta confusión.. PHP

Últimamente estoy viendo a demasiada gente que utiliza mb_strlen en vez de strlen creyendo que esta ultima es mas lenta y no deberia utilizarse.

ESTÁN EQUIVOCADOS. (TQD)

La confusión quizás viene de la documentación de PHP donde mt_rand (mt y mb.. diferentes) es supuesta-mente mas rápido. Bien, aparte de que todo esto es erróneo, no se confundan. Tanto strlen() como rand() son mas rápidos que mb_strlen() y mt_rand().

Actualizacion 20/12/2013.
@AlbertoTICote y @chusop mencionaron el post en Twitter y aprovechando la actualización a WP.3.8 voy a hacer unas aclaraciones ya que creo que no las deje claras xD

MB NO ES LO MISMO QUE MT

Mientras que MB quiere decir multi-byte, MT es el prefijo de la creadora del algoritmo que usa mt_rand. Nunca en ningún caso se debe comparar MB con MT. MB sirve para soporte de caracteres multi-byte y para nada mas.

El objetivo del post

Lo único que quiero decir es que he visto codigos (scripts) que utilizan MB en vez de strlen (en casos totalmente innecesarios) con comentarios del tipo:
// mb is faster
.

Comparar velocidad

Aparte también se menciona (recuerdo leer xD) que no había sentido en comparar las velocidades entre strlen y mb_strlen.. Bueno si os pasais por otras entradas mas recientes (SPAM!!) veréis que soy un obsesionado con la velocidad ... yo lo considero un buen punto de referencia para gente como yo.. pero en ningun caso quiero dar a entender que hay que utilizar strlen en vez de mb_strlen.

PD: Para los interesados en caracteres unicode, MB y demás.. recomiendo este articulo del señor Joel Spolsky.
The Absolute Minimum Every Software Developer Absolutely, Positively Must Know About Unicode and Character Sets (No Excuses!)

PD2: He quitado la pregunta del final (¿y ahora cual vas a usar?) por la confusión que puede generar.


El caso de mt_rand.


Cuando la función mt_rand fue creada, esta utilizaba (utiliza) el algoritmo de Mersenne Twister. Hace 10 años, este algoritmo era (efectivamente) 4 veces mas rápido que el que utilizaba rand(). La cuestión es... ese algoritmo tiene 10 años.. desde entonces hasta ahora rand() se ha perfeccionado y es incluso mas rápido que mt_rand.

La comparación entre mb_strlen y strlen.

Un usuario de PHP.net publico estos benchmarks:
# test runs: 1000000
# benchmarking strlen vs. mb_strlen
# normal strlen: 3.6795361042023 ms, average: 3.6795361042023E-6 ms
# mb_strlen: 5.5934538841248 ms, average: 5.5934538841248E-6 ms

La comparación entre mt_rand y rand.

Otro usuario, publico en su blog este benchmark.
100000 random numbers generated in 0.127249002457 seconds using rand();
100000 random numbers generated in 0.140385866165 seconds using mt_rand();

Saludos

Comentarios

Entradas populares de este blog