jueves, noviembre 22, 2007

¿Qué es más rápido, C, Java o GNU-Java??

Estoy empezando con esto del Java.

De momento me estoy leyendo los fundamentos del lenguaje, y haciendo algunos experimentos. Parece imposible empezar en esto por uno sólo: es tal la confusión de estructuras, librerías, etc. que parece que no hay por dónde empezar. De hecho, llevo varios meses leyendo sin atreverme a tocar una línea de código porque no sé por dónde empezar.

Bueno, a lo que vamos, como paso previo he hecho una prueba a ver cuán rápido es Java. Más que nada, porque Java es un lenguaje interpretado. Bueno, los puristas dirán que no lo es, que se ejecuta una máquina virtual y que se "compila" en forma de bytecodes... ya. También los antiguos compiladores de Basic hacían eso y decíamos que era interpretado.

Tengo hecho en C un programa llamado Balanza que es un auténtico devorador de CPU. En otro post os contaré la historia de Balanza. He pasado el programa a Java y también lo he compilado con gcj, el compilador de java de GNU.

Y a los tres los he ejecutado en un SuSE Linux 10.1 con version de kernel 2.6.16. ¿El resultado? Redoble de tambores, por favor.

  • El programa en C tardó 47 minutos 23 segundos
  • El programa en Java (1.6.0_02) tardó 93 minutos, 39 segundos
  • El programa en gcj (4.1.0) tardó 465 minutos, 15 segundos!!!
Señores, esto es un escándalo (por no decir otra cosa). El programa en Java es el doble de lento, pero ojito, que el programa en gcj es casi cuatro veces más lento que el mismo programa compilado en Java (y casi nueve veces más que el de C).

En fin, que tanto se dijo en aquellos días que parecen olvidados que Java era igual de rápido que C, que si el Just-in-time le daba la misma rapidez... vamos, como que es lo mismo. Hagan la prueba y vean.






jueves, agosto 23, 2007

Flag of Madrid


Flag of Madrid, originally uploaded by superman_ha_muerto.

Esta foto es de la bandera de Madrid que hay en los juzgados de Plaza de Castilla. Simplemente estoy probando la facilidad de flickr para publicar fotos.

Puedes ver todas mis fotos en:

Mis fotos en flickr




domingo, marzo 04, 2007

Matemáticas IP

Recientemente me preguntaron cómo se calcula cuantos ordenadores pertenecen a una red IP. La pregunta está muy relacionada con saber si un ordenador pertenece o no a una red dada y cómo podemos configurar adecuadamente la máscara y la dirección IP de un equipo... O de toda una red. Vamos allá.

Matemática binaria

Antes de abordar este tema tenemos que saber un poco sobre cómo operar con números binarios. Primero la conversión decimal-binario.

De binario a decimal
Para saber cómo se representa en decimal el número binario 01001000 haremos lo siguiente:

01001000
= 0*2^7
+ 1*2^6
+ 0*2^5
+ 0*2^4
+ 1*2^3
+ 0*2^2
+ 0*2^1
+ 0*2^0

Es decir:

01001000
= 0*128
+ 1*64
+ 0*32
+ 0*16
+ 1*8
+ 0*4
+ 0*2
+ 0*1

O sea que:

01001000 = 64 + 8 = 72

De decimal a binario
A la inversa lo podemos hacer mediante divisiones sucesivas por dos:

72 / 2 = 36, resto 0
36 / 2 = 18, resto 0
18 / 2 = 9, resto 0
9 / 2 = 4, resto 1
4 / 2 = 2, resto 0
2 / 2 = 1, resto 0

La representación en binario del número 72 se obtiene tomando el último cociente y todos los restos. Los he marcado con un * para que se vean:

72 / 2 = 36, resto 0*
36 / 2 = 18, resto 0*
18 / 2 = 9, resto 0*
9 / 2 = 4, resto 1*
4 / 2 = 2, resto 0*
2 / 2 = 1* resto 0*

Es decir 1001000 (tomamos los números de abajo a arriba).

And a nivel de bit
Otra cosa que necesitamos saber es cómo se hace una operación llamada "and" (y lógico) con una secuencia de bits.

Comenzaremos por ver cómo se hace con un bit:

X | Y | X and Y
---+---+---------
0 | 0 | 0
0 | 1 | 0
1 | 0 | 0
1 | 1 | 1

Es decir, sólo devuelve uno cuando hacemos la operación "1 and 1". Vamos a ver qué devuelve "010 and 111":

010 and
111 =
010

Devuelve el mismo número. Bien. Ya estamos listos.

La red IP

Una red IP viene identificada por dos datos: la dirección de red y la máscara. La primera determina cómo serán las direcciones IP y la segunda cuántas caben.

Para verlo más en detalle vamos con un ejemplo. Supongamos que tenemos la dirección de red 10.72.208.0 y la máscara 255.255.255.248. Para saber si una IP dada -pongamos que es la 10.72.208.1- pertenece a esa red haremos un and entre la IP y la máscara. Si nos devuelve la dirección de red, entonces pertenece.

Veamos:

IP and mascara = direccion_de_red

10.72.208.1 and
255.255.255.248 =

O lo que es lo mismo:

00001010.01001000.11010000.00000001 and
11111111.11111111.11111111.11111000 =
00001010.01001000.11010000.00000000

Que en decimal resulta:

10.72.208.1 and
255.255.255.248 =
10.72.208.0

O sea, la direccion de red. Esta IP pertenece a la red.

Probemos ahora con la dirección IP 10.72.208.72. ¿pertenecerá a la red? Veamoslo:

10.72.208.72 and
255.255.255.248 =


00001010.01001000.11010000.01001000 and
11111111.11111111.11111111.11111000 =
00001010.01001000.11010000.01001000

O sea:

10.72.208.72 and
255.255.255.248 =
10.72.208.72

Que no es la dirección de red, 10.72.208.0; por lo que ésta dirección no pertenece a la red.

Varios ejemplos mas:

10.72.208.8 and
255.255.255.248 =
10.72.208.0 (pertenece)


10.72.208.16 and
255.255.255.248 =
10.72.208.16 (no pertenece)


10.72.208.18 and
255.255.255.248 =
10.72.208.2 (no pertenece)

En realidad, el número de elementos que caben en una red viene dado por el número de bits a cero que hay en la máscara. En nuestro ejemplo, 255.255.255.248 hay tres bits a cero:

11111111.11111111.11111111.11111000

Indica que las direcciones de esta red serán las que acaben en los digitos binarios 001, 010, 011, 100, 101, 110, 111 y el resto de bits coincidentes con la ip de la red.

A medida que aumentemos los ceros, aumentarán las direcciones IP que caben en la red, y cambiara en consecuencia la máscara de red. Por ejemplo, 255.255.255.0 caben 255 direcciones.

Como puede verse, el calculo de las direcciones IP que caben en una red viene determinado por la dirección de red y por la mascara. Con operaciones binarias sencillas podemos saber si una IP pertenece a una red dada y también cuáles serán las IP's que la formen.