Retroceder   Foros del Web > Programación para sitios web > PHP > PHP orientado a objetos

Respuesta
 
Herramientas Desplegado
Antiguo 02-feb-2008, 15:42   #1 (permalink)
jerkan tiene algunos puntos positivos de karma
 
Avatar de jerkan
 
Fecha de Ingreso: septiembre-2005
Mensajes: 1.361
Pregunta Idiomas. Constantes o arrays?

Hola a todos,

yo, hasta ahora, definía las cadenas afectadas por el idioma con constantes (define). Pero entrando en el mundo de los frameworks, he visto que se utilizan arrays pero no entiendo muy el por qué.
Una cadena afectada por el idioma no tiene que cambiar durante la ejecución de la aplicación. Entonces, ¿por qué se utilizan arrays?
Sé que, a nivel de organización, es mejor acceder a las cadenas de texto mediante objetos (ej: $this->lang['nombre']) pero, en teoría, esto afecta al rendimiento, no?

¿Vosotros qué opináis?
__________________
jerkan.net
jerkan está desconectado   Responder Citando
Antiguo 02-feb-2008, 16:04   #2 (permalink)
aloqui tiene algunos puntos positivos de karma
 
Avatar de aloqui
 
Fecha de Ingreso: diciembre-2007
Mensajes: 916
Re: Idiomas. Constantes o arrays?

La diferencia en rendimiento es mínima, y más en un lenguaje como PHP.
aloqui está desconectado   Responder Citando
Antiguo 03-feb-2008, 01:58   #3 (permalink)
jerkan tiene algunos puntos positivos de karma
 
Avatar de jerkan
 
Fecha de Ingreso: septiembre-2005
Mensajes: 1.361
Re: Idiomas. Constantes o arrays?

Cita:
Iniciado por aloqui Ver Mensaje
La diferencia en rendimiento es mínima, y más en un lenguaje como PHP.
¿Hablas con conocimiento de causa? o ¿hay algún estudio al respecto?
__________________
jerkan.net
jerkan está desconectado   Responder Citando
Antiguo 03-feb-2008, 03:05   #4 (permalink)
aloqui tiene algunos puntos positivos de karma
 
Avatar de aloqui
 
Fecha de Ingreso: diciembre-2007
Mensajes: 916
Re: Idiomas. Constantes o arrays?

Si las cadenas las hubiese que buscar en BD o en ficheros de recursos puede que ello afectara al rendimiento, pero a no ser que los arrays tengan millones de registros, el acceso es a memoria, con lo cual la perdida de rendimiento es despreciable.
Puedes comprobarlo tu mismo poniendo cronometros y haciendolo de las dos fomas.
aloqui está desconectado   Responder Citando
Antiguo 08-feb-2008, 08:37   #5 (permalink)
jerkan tiene algunos puntos positivos de karma
 
Avatar de jerkan
 
Fecha de Ingreso: septiembre-2005
Mensajes: 1.361
Re: Idiomas. Constantes o arrays?

Bueno, pues me decidí a hacer un pequeño script para ver qué opción era más rápida y, para mi sorpresa, los arrays son mucho más rápidos de acceder que las constantes. Aquí el script:
Código PHP:
            // test 
        $n = isset($_GET['n']) ? $_GET['n'] : 1000;
        $decimals = 6;
        $key_prefix = 'CONST_';
        $test_file = 'test_const.php';
        
    // create content of test file
    
        for( $index = 1; $index <= $n; $index++ )
        {
            $const[] = "define('".$key_prefix.$index."', '$index');";
            $const_check[] = "\$var = ".$key_prefix.$index.";";
            
            $var[] = "\$array['".$key_prefix.$index."'] = $index;";
            $var_check[] = "\$var = \$array['".$key_prefix.$index."'];";
        }
        
    // write into file
    
        $handle = @fopen($test_file, "w");
        
        $new_line = "\r\n";
        fwrite($handle, "<?php $new_line$new_line");
        fwrite($handle, "
$new_line echo "Number of elements (constants/vars): $n<br />\";");
        
fwrite($handle"$new_line \$start_memory = memory_get_usage();$new_line");
        
fwrite($handleimplode(''$const));
        
fwrite($handle"$new_line \$used_memory_const = (memory_get_usage() - \$start_memory);$new_line");
        
fwrite($handle"$new_line \$start_time = microtime();$new_line");
        
fwrite($handleimplode(''$const_check));
        
fwrite($handle"$new_line \$time_defines = microtime() - \$start_time; $new_line");
        
fwrite($handle"$new_line echo \"<br />With defines: \";");
        
fwrite($handle"$new_line echo number_format(\$time_defines, $decimals).\" sec. and \".\$used_memory_const.\" used memory.\";");
        
        
fwrite($handle"$new_line \$start_memory = memory_get_usage();$new_line");
        
fwrite($handleimplode(''$var));
        
fwrite($handle"$new_line \$used_memory_vars = (memory_get_usage() - \$start_memory);$new_line");
        
fwrite($handle"$new_line \$start_time = microtime();$new_line");
        
fwrite($handleimplode(''$var_check));
        
fwrite($handle"$new_line \$time_vars = microtime() - \$start_time;");
        
fwrite($handle"$new_line echo \"<br />With vars: \";");
        
fwrite($handle"$new_line echo number_format(\$time_vars, $decimals).\" sec. and \".\$used_memory_vars.\" used memory.\";");
        
fwrite($handle"$new_line echo \"<br /><br />Constants vs. Variables: \";");
        
fwrite($handle"$new_line echo \"<br />% Time: \".number_format(\$time_defines/\$time_vars*100, 2).\"%\";");
        
fwrite($handle"$new_line echo \"<br />% Memory: \".number_format(\$used_memory_const/\$used_memory_vars*100, 2).\"%\";");
        
fwrite($handle"$new_line?>");
        
        
fclose($handle);
        
    
// execute test
    
        
include($test_file);
Lo hice de este modo porque creo que no se puede acceder al valor de una constante dinámicamente. Cualquier crítica constructiva será bien recibida.

Un saludo.

EDITADO: He añadido información acerca de la memoria usada. Con variables se utiliza bastante más de memoria (el % usado por constantes es aproximadamente el 20% del usado por variables).
__________________
jerkan.net

Última edición por jerkan; 09-feb-2008 a las 05:19.
jerkan está desconectado   Responder Citando
Respuesta
Calificación: Calificación de Tema: 1 votos, 1,00 de promedio.


Herramientas
Desplegado

Normas de Publicación
No puedes crear nuevos temas
No puedes responder temas
No puedes subir archivos adjuntos
No puedes editar tus mensajes

BB code is Activado
Caritas están Activado
[IMG] está Activado
Código HTML está Desactivado


La Zona horaria es GMT -6. Ahora son las 09:10.


Message Board Statistics

LinkBacks Enabled by vBSEO 3.1.0

1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93