PDF de programación - Curso 2014 Un problema de rendimiento

Imágen de pdf Curso 2014 Un problema de rendimiento

Curso 2014 Un problema de rendimientográfica de visualizaciones

Publicado el 19 de Abril del 2017
969 visualizaciones desde el 19 de Abril del 2017
1,0 MB
9 paginas
Creado hace 9a (14/11/2014)
Introducción
En esta práctica vamos a estudiar un problema de rendimiento. No es evidente al
principio, pero veremos que las malas decisiones afectan al rendimiento del código.
Pero ese rendimiento no se hubiera alterado si la aplicación no hubiera sido
distribuida.

Curso de Middleware. Práctica Problema de Rendimiento

1 de 9

Problemas de Rendimiento
Abre el proyecto que acompaña la práctica con el Visual Studio. Cuando lo abras
tendrás que ver lo siguiente:

Primero observa que tenemos una clase que representa la información de una persona.

[Serializable]
public class Person
{
public Person(string fName, string lName)
{
this.FirstName = fName;
this.LastName = lName;
}

public string FirstName { get; private set; }
public string LastName { get; private set; }
}

Además, existe otra clase que representa una colección de personas:

Curso de Middleware. Práctica Problema de Rendimiento

2 de 9

public class People : MarshalByRefObject, IEnumerable
{
public static int size = 5000;

private Person[] _people;

public People()
{
_people = new Person[size];

for (int i = 0; i < _people.Length; i++)
{
_people[i] = new Person("Name_" + i, "LastName_" +
i);
}
}

public int Length
{
get { return _people.Length; }
}

public Person this[int i]
{
get { return _people[i]; }
}
...
}

Por otra parte, observa que tenemos un programa principal que crea un objeto de dicha
clase y que llama a los métodos existentes.

Curso de Middleware. Práctica Problema de Rendimiento

3 de 9

. . .
People peopleList = new People();

Stopwatch sw = new Stopwatch();
sw.Start();

foreach (Person p in peopleList)
Console.WriteLine(p.FirstName + ", " + p.LastName);
DateTime timeAfter = DateTime.Now;

sw.Stop();
Console.WriteLine("Elapsed={0}", sw.Elapsed);

. . .

Lo único que estamos haciendo es crear una colección de personas y recorrer esa
colección con un for. Imprimimos por pantalla la información de cada persona. Si
miramos el código de la colección, vemos que internamente es un array de 5000
personas. Nada en ese código nos debería sorprender.
Primero vamos a ejecutar el ejemplo en modo no distribuido. Ponemos el cliente
como proyecto de arranque y ejecutamos. En mi ordenador yo obtengo unos tiempos
próximos a 0.37 segundos.

Ahora vamos a jugar con la implementación de la colección. En el código de la
colección veréis una línea que pone “static bool usoBueno = true;”. En esa línea
vamos a cambiar el true por un false. Ahora volvemos a ejecutar y los tiempos
obtenidos deberán ser muy similares.

Curso de Middleware. Práctica Problema de Rendimiento

4 de 9

Nada raro por ahora, ¿verdad?
Pero ahora vamos a probar el mismo código pero en modo distribuido. Para ello
debemos arrancar tanto el cliente como el servidor. También debemos quitar el
comentario que tenemos en la línea de configuración de remoting en el cliente. Al
quitar ese comentario, el cliente se configura para utilizar la versión remota de nuestra
colección.
Recordad que con el VisualStudio podemos arrancar dos proyectos simultáneamente
si seleccionamos “propiedades” en la solución y seleccionamos la alternativa de
arrancar varios proyectos simultáneamente.

Curso de Middleware. Práctica Problema de Rendimiento

5 de 9

Antes de volver a ejecutar el proyecto, recordad que tenemos que poner la variable
usoBueno a true. Si ya lo has hecho, ahora vamos a contrastar los tiempos en el modo
distribuido. En mi ordenador, al ejecutar la aplicación obtengo unos tiempos que
oscilan alrededor de 1.5 segundos. En realidad tiene sentido que sea algo peor que el
modo no distribuido pero tampoco estamos tan lejos. El resultado de la ejecución
debería ser algo del siguiente estilo:

Curso de Middleware. Práctica Problema de Rendimiento

6 de 9

El siguiente paso es volver a comprobar los tiempos cuando usoBueno es false.
Cambiadlo y volver a ejecutar. Pero ahora nos vamos a encontrar con una sorpresa.
Los tiempos obtenidos deberán ser malos, muy malos. En mi ordenador obtuve unos
tiempos de 8 segundos (casi 5 veces peor!):

Seguramente en vuestro caso suceda algo parecido, verdad?. Pues el objetivo de
nuestra práctica es investigar dónde está el problema. ¿Podéis encontrar la razón de tal
pérdida de rendimiento? ¿Tiene sentido?

Curso de Middleware. Práctica Problema de Rendimiento

7 de 9

Ejercicios adicionales

Os proponemos varios ejercicios que nos ayuden a entender el problema de
rendimiento. No los realices hasta haber completado y discutido sobre el punto
anterior. Intenta lo siguiente:

1. Cambiad la configuración de Remoting tanto en el cliente como en el servidor.
En esos ficheros (Client.config y Server.config) el canal está configurado
utilizando un protocolo binario sobre tcp.
En el cliente veremos algo similar a:
<wellknown type="People, Collection"

url="tcp://localhost:8811/PeopleService" />

Y en la configuración del servidor veremos:
<channel ref="tcp" port="8811">
Cambiad esas entradas y poned en su lugar “http”. Por ejemplo:
<wellknown type="People, Collection"
url="http://localhost:8811/PeopleService" />
y :
<channel ref="http" port="8811">
¿Qué tiempos obtienes ahora tanto con usoBueno = true y false?
En mi caso obtuve con usoBueno=true unos tiempos de 5.2 segundos, y con
usoBueno=false de 24 sg. Busca información sobre los canales de Remoting
“tcp” y “http” o pregunta a tu profesor.

2. Volviendo a poner el protocolo en tcp, probad con diferentes tamaños de
clientes (por ejemplo, 5.000, 50.000, 250.000, 500.000 y 1.000.000). En mi
ordenador obtuve los siguientes resultados:

Tamaño

5M
50M
250M
500M
1.000M

Bueno true
1.5
1.7
10.4
36.1
140.9

Bueno False
8
65.6
287.5
676.9
1159.1

Os animo a calcular la proporción entre los tiempos obtenidos y el tamaño de
la colección. Se puede observar que hay diferencias significativas en esa
proporción. Intenta explorar la razón de tal comportamiento.

3. Finalmente, si dispones de un analizador de paquetes (Wireshark) intenta
buscar la diferencia entre ambos modelos. Os adjunto una prueba obtenida con
una colección de 5 personas.
Primero esto es lo que se observa con el uso bueno:

Curso de Middleware. Práctica Problema de Rendimiento

8 de 9

Y con el uso malo:

Lo que se observa es un mayor tráfico en la red. Y en el caso “malo” el número de
paquetes es proporcional al tamaño de la colección. ¿Puedes encontrar la razón de tal
comportamiento?
Si os resulta complejo repetir el experimento, los archivos con los paquetes recibidos
están disponibles para vuestro estudio.

Curso de Middleware. Práctica Problema de Rendimiento

9 de 9
  • Links de descarga
http://lwp-l.com/pdf3131

Comentarios de: Curso 2014 Un problema de rendimiento (0)


No hay comentarios
 

Comentar...

Nombre
Correo (no se visualiza en la web)
Valoración
Comentarios...
CerrarCerrar
CerrarCerrar
Cerrar

Tienes que ser un usuario registrado para poder insertar imágenes, archivos y/o videos.

Puedes registrarte o validarte desde aquí.

Codigo
Negrita
Subrayado
Tachado
Cursiva
Insertar enlace
Imagen externa
Emoticon
Tabular
Centrar
Titulo
Linea
Disminuir
Aumentar
Vista preliminar
sonreir
dientes
lengua
guiño
enfadado
confundido
llorar
avergonzado
sorprendido
triste
sol
estrella
jarra
camara
taza de cafe
email
beso
bombilla
amor
mal
bien
Es necesario revisar y aceptar las políticas de privacidad