Foros del Web » Programando para Internet » PHP » Frameworks y PHP orientado a objetos »

Idiomas. Constantes o arrays?

Estas en el tema de Idiomas. Constantes o arrays? en el foro de Frameworks y PHP orientado a objetos en Foros del Web. Hola a todos, yo, hasta ahora, definía las cadenas afectadas por el idioma con constantes ( define ). Pero entrando en el mundo de los ...
  #1 (permalink)  
Antiguo 02/02/2008, 16:42
Avatar de jerkan  
Fecha de Ingreso: septiembre-2005
Mensajes: 1.607
Antigüedad: 18 años, 7 meses
Puntos: 19
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?
  #2 (permalink)  
Antiguo 02/02/2008, 17:04
Avatar de aloqui  
Fecha de Ingreso: diciembre-2007
Mensajes: 973
Antigüedad: 16 años, 5 meses
Puntos: 24
Re: Idiomas. Constantes o arrays?

La diferencia en rendimiento es mínima, y más en un lenguaje como PHP.
__________________
Grupos de Música
Pop Music Stars
  #3 (permalink)  
Antiguo 03/02/2008, 02:58
Avatar de jerkan  
Fecha de Ingreso: septiembre-2005
Mensajes: 1.607
Antigüedad: 18 años, 7 meses
Puntos: 19
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?
  #4 (permalink)  
Antiguo 03/02/2008, 04:05
Avatar de aloqui  
Fecha de Ingreso: diciembre-2007
Mensajes: 973
Antigüedad: 16 años, 5 meses
Puntos: 24
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.
__________________
Grupos de Música
Pop Music Stars
  #5 (permalink)  
Antiguo 08/02/2008, 09:37
Avatar de jerkan  
Fecha de Ingreso: septiembre-2005
Mensajes: 1.607
Antigüedad: 18 años, 7 meses
Puntos: 19
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).

Última edición por jerkan; 09/02/2008 a las 06:19
Atención: Estás leyendo un tema que no tiene actividad desde hace más de 6 MESES, te recomendamos abrir un Nuevo tema en lugar de responder al actual.
Respuesta




La zona horaria es GMT -6. Ahora son las 07:44.