A la espera del futuro Flash 8, que parece ser tendrá un rendimiento de hasta 10 mejor que la versión actual, me he decidido comparar la velocidad de cálculo de Flash 7, con la de otras tecnologías.
Para ello, he hecho un pequeño programa que se encarga de calcular los números primos existentes entre el 1 y el 10.000 e informar del tiempo invertido en el cálculo.
Posteriormente he portado el programa a algunos lenguajes comunes que tenía a mano.
Sinceramente, me he llevado una desagradable sorpresa al comprobar los resultados. Su desempeño ha sido menor que el de lenguajes puramente interpretados como Javascript o PHP. Es muy extraño, en principio Flash genera un bytecode que luego es interpretado por el reproductor de Flash, mientras que Javascript se interpreta totalmente, por lo que sobre el papel, Flash debería ser algo más eficiente.
Tampoco hubiera dicho nunca que Visual Basic .NET 2003 iba a ser algo más eficiente que Visual Basic 6.
La versión en Javascript la he probado con Internet Explorer y con Mozilla Firefox, los resultados han sido muy similares. Por fin el equipo de desarrollo de Gecko ha conseguido implementar un intérprete de Javascript con rendimiento equiparable al de Microsoft.
Como siempre, el código C++ arrasa con todos los contendientes, bueno, salvo con el código ensamblador x86, pero no tenía ganas de ponerme a prueba.
Los tests lao he ejecutado varias veces. En los casos en los que el tiempo de ejecución era muy breve, he aumentado el número de iteraciones para poder extrapolar de forma más precisa.
El equipo de pruebas era un Pentium 4 a 2800 con 1 Gb de RAM bajo Windows XP Professional SP2.
Estos son los resultados que he obtenido:
Herramienta | Tiempo de ejecución (ms) | Iteraciones por segundo |
Visual C++ 7.1 | 145 | 34.482 |
Visual Basic .NET 2003 | 256 | 19.531 |
Visual Basic 6 SP5 | 260 | 19.230 |
PHP 5.0.2 | 1.470 | 2.940 |
Javascript (Firefox 1.0 RC1) | 1.984 | 2.520 |
Javascript (Internet Explorer 6) | 1.875 | 2.666 |
Flash 7.2 | 8.453 | 591 |
En todos los casos he intentado aplicar las opciones de compilación que podían generar un ejecutable más veloz.
Quizás en otras plataformas, los resultados varíen. En ese caso, me encantaría que me comunicarais vuestro balance.
Actualización
He estado dándole algunas vueltas a la versión de Flash para conseguir mejor rendimiento. Lo único que se me ha ocurrido es declarar el tipo de las variables, de forma que se asuman como numéricas en vez de como variant. Tras este cambio, el tiempo ha bajado hasta 8250 ms, tan solo una pequeña mejora.
Yo lo he probado en Delphi 6:
————————
program Primos;
{$APPTYPE CONSOLE}
uses
SysUtils;
var
nInicio, nFin: real;
nCount, nDiv: integer;
lPrime: boolean;
begin
nInicio := time();
for nCount := 1 to 5000 do
begin
lPrime := true;
for nDiv := 2 to nCount do
begin
if ( nCount mod nDiv ) = 0 then
begin
lPrime := false;
break;
end;
end;
if lPrime then ;
//trace(iCount);
end;
nFin := time();
write( ( nFin – nInicio ) * 1000 );
readln;
end.
————————
Y creo qué está bien escrito, lo que pasa es que cada vez me saca un tiempo distinto (entre 1.5E-4 y 3.5E-4). No sé si usar time() está bien, porque acabo de empezar a aprender Pascal… ¿alguien lo puede comprobar?
El problema no creo que sea la función time(), sino que al tardar el proceso entre 1500 y 3500 ms, a poco que Windows tenga que procesar algún mensaje de más, da la variación del 250% que comentas.
Seguro que si en vez de 5000 pones 50000 te saldrá un valor más coherente. En mis pruebas (con Delphi 7) ha dado 2350, o sea, 235 para 5000 iteraciones.
El resultado parece coherente, algo más eficiente que VB, y bastante menos que C++.
Que tiempo la nomenglatura de codificación xBase…