En PHP tengo por costumbre el usar variables globales como constantes, pero no ha sido hasta hace bien poco que me he cuestionado su eficiencia, teniendo en cuenta que existe define.

Pensando de manera análoga a C, suponía que define iba a ser mucho más eficiente, al ser una constante definida en tiempo de interpretación. Nada más sencillo que comprobarlo con el siguiente código:

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
<?php
	$KI_MAX_ITER = 1000;
	define('KI_MAX_ITER', 1000);
 
	$fInicio=microtime(true);
	for ($iCont1=0; $iCont1<$KI_MAX_ITER; $iCont1++)
	{
		for ($iCont2=0; $iCont2<$KI_MAX_ITER; $iCont2++)
		{
			$iCont3=($KI_MAX_ITER != $KI_MAX_ITER);
			$iCont3=$KI_MAX_ITER;
			$iCont3=($KI_MAX_ITER == $KI_MAX_ITER);
		}
 
	}
	$fFin=microtime(true);
	echo ($fFin - $fInicio) . '<br>';
 
	$fInicio=microtime(true);
	for ($iCont1=0; $iCont1<KI_MAX_ITER; $iCont1++)
	{
		for ($iCont2=0; $iCont2<KI_MAX_ITER; $iCont2++)
		{
			$iCont3=(KI_MAX_ITER != KI_MAX_ITER);
			$iCont3=KI_MAX_ITER;
			$iCont3=(KI_MAX_ITER == KI_MAX_ITER);
		}
 
	}
	$fFin=microtime(true);
	echo ($fFin - $fInicio) . '<br>';
?>

El resultado es que usar una varíable de ámbito global ha llevado 0.41 segundos, mientras que hacerlo con define 0.89. En conclusión, a la hora de usar constantes, evita define siempre que sea posible, usando en su defecto variables globales.

Actualizado a martes 22 de marzo de 2011. 8:14:
Aclarando el apunte de Fernando, debo indicar que las pruebas iniciales protagonistas de este artículo se efectuaron con una versión algo antigua de PHP, la 5.2.3 que es la que tenía en mi servidor de desarrollo.

Tras actualizar a PHP 5.3.6, los resultados obtenidos han sido bien distintos: 0.18 para define, y 0.64 para variable global. Por tanto vemos que la rama 5.3.x es más rápida que la 5.2.x, pero sobre todo, vemos que han cambiado las tornas, y que se confirma lo comentado por Fernando. Es más veloz el uso de define.

Es el resultado lógico que cabría esperar, y que sólo puedo atribuir a un bug en implementaciones anteriores de PHP.