• Publicidad

Velocidad de Socket impredecible en Windows

Así que programas sin strict y las expresiones regulares son otro modo de hablar. Aquí encontrarás respuestas de nivel avanzado, no recomendable para los débiles de corazón.

Velocidad de Socket impredecible en Windows

Notapor Leotrillo » 2012-05-29 09:56 @455

Hola, estoy haciendo pruebas de rendimiento para ver la mejor opción para usar sockets en Windows.

He hecho dos funciones distintas en el cliente, una de ellas abre socket, envía una cadena dentro de un for(), cierro socket y mido tiempos. La otra función abre un socket por iteración, envía la cadena, cierra socket por iteración y mido tiempos.

Obviamente la segunda opción tarda más, pero más allá de eso el problema es la inestabilidad de tiempos.

En Linux he probado este cliente/servidor y los tiempos salen prácticamente todos iguales en las distintas pruebas que he hecho. Sin embargo en Windows cada vez me sale una cosa y no veo forma/opción/parámetro para poder estabilizar estas conexiones: cada vez me sale una cosa distinta

Os copio el cliente, el servidor y la salida de consola de los tiempos:

Cliente:
Sintáxis: [ Descargar ] [ Ocultar ]
Using perl Syntax Highlighting
  1. use IO::Socket;
  2. use Benchmark;
  3. use Time::HiRes;
  4.  
  5. $cantidad = 1000;
  6.  
  7. &abro_una_vez;
  8. &abro_muchas_veces;
  9.  
  10. sub abro_una_vez {
  11.  
  12.     my $tiempo_inicial = new Benchmark;
  13.     $time_cpu = Time::HiRes::time();
  14.  
  15.     my $sock = new IO::Socket::INET(
  16.         PeerAddr => 'localhost',
  17.         PeerPort => '7070',
  18.         Proto    => 'tcp',
  19.     );
  20.     die "Could not create socket: $!\n" unless $sock;
  21.  
  22.     my $i = 0;
  23.  
  24.     for ( $i = 0; $i < $cantidad; $i++ ) {
  25.         print $sock " $i - Bazinga!\n";
  26.     }
  27.  
  28.     close($sock);
  29.  
  30.     my $tiempo_final = new Benchmark;
  31.     $resulttime_cpu = Time::HiRes::time() - $time_cpu;
  32.  
  33.     my $tiempo_total = timediff( $tiempo_final, $tiempo_inicial );
  34.  
  35.     #print "BENCHMARK: $cantidad registros ha costado:",timestr($tiempo_total),"\n";
  36.     print "\n";
  37.     print "TIME:HiRes de $cantidad  open/close fuera bucle: $resulttime_cpu";
  38.     print "\n";
  39. }
  40.  
  41. sub abro_muchas_veces {
  42.  
  43.     my $tiempo_inicial1 = new Benchmark;
  44.     $time_cpu1 = Time::HiRes::time();
  45.  
  46.     my $i = 0;
  47.     for ( $i = 0; $i < $cantidad; $i++ ) {
  48.         my $sock1 = new IO::Socket::INET(
  49.             PeerAddr => 'localhost',
  50.             PeerPort => '7070',
  51.             Proto    => 'tcp',
  52.         );
  53.         die "Could not create socket: $!\n" unless $sock1;
  54.         print $sock1 " $i - Bazinga!\n";
  55.         close($sock1);
  56.     }
  57.  
  58.     my $tiempo_final1 = new Benchmark;
  59.     $resulttime_cpu1 = Time::HiRes::time() - $time_cpu1;
  60.  
  61.     my $tiempo_total1 = timediff( $tiempo_final1, $tiempo_inicial1 );
  62.  
  63.     #print "BENCHMARK: $cantidad registros ha costado:",timestr($tiempo_total1),"\n";
  64.     print "\n";
  65.     print "TIME:HiRes de $cantidad open/close dentro bucle: $resulttime_cpu1";
  66.     print "\n";
  67. }
  68.  
Coloreado en 0.004 segundos, usando GeSHi 1.0.8.4


El Servidor:
Sintáxis: [ Descargar ] [ Ocultar ]
Using perl Syntax Highlighting
  1. use IO::Socket::INET;
  2.  
  3. # flush after every write
  4. $| = 1;
  5.  
  6. my ( $socket,      $client_socket );
  7. my ( $peeraddress, $peerport );
  8.  
  9. # creating object interface of IO::Socket::INET modules which internally does
  10. # socket creation, binding and listening at the specified port address.
  11. $socket = new IO::Socket::INET(
  12.     LocalHost => 'localhost',
  13.     LocalPort => '7070',
  14.     Proto     => 'tcp',
  15.     Listen    => 5,
  16.     Reuse     => 1
  17. ) or die "ERROR in Socket Creation : $!\n";
  18.  
  19. print "SERVER Waiting for client connection on port 7070 \n";
  20.  
  21. while (1) {
  22.  
  23.     # waiting for new client connection.
  24.     $client_socket = $socket->accept();
  25.  
  26.     # get the host and port number of newly connected client.
  27.     $peer_address = $client_socket->peerhost();
  28.     $peer_port    = $client_socket->peerport();
  29.  
  30.     #print "Accepted New Client Connection From : $peeraddress, $peerport\n ";
  31.  
  32.     # write operation on the newly accepted client.
  33.     $data = "DATA from Server";
  34.     print $client_socket "$data\n";
  35.  
  36.     # we can also send the data through IO::Socket::INET module,
  37.     $client_socket->send($data);
  38.  
  39.     # read operation on the newly accepted client
  40.     $data = <$client_socket>;
  41.  
  42.     # we can also read from socket through recv()  in IO::Socket::INET
  43.     # $client_socket->recv($data,1024);
  44.     #print "Received from Client : $data\n";
  45. }
  46.  
  47. $socket->close();
  48.  
Coloreado en 0.002 segundos, usando GeSHi 1.0.8.4


Esta es la salida. Como veréis los tiempos son distintos en un orden de magnitud muy elevado (a veces tarda 0.021313 y otras 1.435220 (ejecutando lo mismo) Nótese que abrir/cerrar socket dentro del for() es más estable en tiempo que un socket único :-(

Me he quedado sin ideas, no sé si es directamente problema de Windows o se puede estabilizar tocando el registro de Windows, versión de Perl o algún parámetro. ¿Tenéis alguna idea?

Muchas gracias.
Adjuntos
Capture2.PNG
version de Perl
Capture2.PNG (10.57 KiB) Visto 1926 veces
Capture.PNG
Tiempos
Capture.PNG (12.13 KiB) Visto 1926 veces
Leotrillo
Perlero nuevo
Perlero nuevo
 
Mensajes: 15
Registrado: 2010-11-24 18:08 @797

Publicidad

Re: Velocidad de Socket impredecible en Windows

Notapor explorer » 2012-05-29 13:27 @602

¿No tendrás puesto un antivirus/cortafuegos?

De todas maneras, si funciona en Linux... ¿para qué buscar más? :mrgreen:

Más en serio... Yo nunca he visto que si un sistema necesitase tanta precisión se pusiera un sistema Windows... Ni siquiera una licencia de Windows NT con extensiones de "tiempo real" garantizaba una buena estabilidad.

Recuerdo que en una ocasión una empresa quería controlar una máquina herramienta de varias toneladas, con precisión de milímetros, y control de tiempos de pocas centésimas de segundos. Después de echar cuantas, resolví que con la agenda electrónica que tenía en ese momento en la mano era más que suficiente, pero la empresa dijo que quería hacerlo con Visual Basic en Windows... porque era lo que *su informático* conocía... :lol: Naturalmente, me negué.

Era obvio que la empresa quería tener acceso al código para poder modificar, cuando ellos quisieran, los parámetros del programa o el programa en sí. Pero para mi ese no era el problema, sino el hecho de hacerlo sobre Windows (las risas y mofas en Ingeniería Informática duraron meses).

En cuanto a lo tuyo... hace años que no manejo Windows, así que no puedo darte muchas pistas, salvo lo que se puede encontrar en Google. Busca por las palabras windows, real-time y communications.
JF^D Perl programming & Raku programming. Grupo en Telegram: https://t.me/Perl_ES
Avatar de Usuario
explorer
Administrador
Administrador
 
Mensajes: 14480
Registrado: 2005-07-24 18:12 @800
Ubicación: Valladolid, España

Re: Velocidad de Socket impredecible en Windows

Notapor Leotrillo » 2012-05-30 06:57 @331

Ok, muchas gracias, voy a ver qué encuentro por ahí, porque la diferencia entre hacerlo con Linux a hacerlo en Windows es exagerada. Lo he estado probando también en servidores Azure y va más lento todavía que en mi local. :-(
Un saludo.
Leotrillo
Perlero nuevo
Perlero nuevo
 
Mensajes: 15
Registrado: 2010-11-24 18:08 @797

Re: Velocidad de Socket impredecible en Windows

Notapor danimera » 2012-06-10 08:42 @404

No puedo meterme en esos temas porque no conozco, pero algo raro pasa, realmente esa precisión, ufff... ¿no será mejor un Unix, Amiga o esas otra cosas...?

Si lo probaste en Windows Azure y va más lento algo raro hay ahí, :?
100% Telch - Perl Web Programming
Cali PerlMongers: http://cali.pm.org
Avatar de Usuario
danimera
Perlero frecuente
Perlero frecuente
 
Mensajes: 871
Registrado: 2005-06-23 19:02 @834
Ubicación: Colombia


Volver a Avanzado

¿Quién está conectado?

Usuarios navegando por este Foro: No hay usuarios registrados visitando el Foro y 26 invitados