Foros del Web

Foros del Web (http://www.forosdelweb.com/)
-   Frameworks y PHP orientado a objetos (http://www.forosdelweb.com/f68/)
-   -   Idiomas. Constantes o arrays? (http://www.forosdelweb.com/f68/idiomas-constantes-arrays-553934/)

jerkan 02/02/2008 16:42

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?

aloqui 02/02/2008 17:04

Re: Idiomas. Constantes o arrays?
 
La diferencia en rendimiento es mínima, y más en un lenguaje como PHP.

jerkan 03/02/2008 02:58

Re: Idiomas. Constantes o arrays?
 
Cita:

Iniciado por aloqui (Mensaje 2272602)
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?

aloqui 03/02/2008 04:05

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.

jerkan 08/02/2008 09:37

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).


La zona horaria es GMT -6. Ahora son las 23:06.

Desarrollado por vBulletin® Versión 3.8.7
Derechos de Autor ©2000 - 2026, Jelsoft Enterprises Ltd.