IdentifiantMot de passe
Loading...
Mot de passe oublié ?Je m'inscris ! (gratuit)
Navigation

Inscrivez-vous gratuitement
pour pouvoir participer, suivre les réponses en temps réel, voter pour les messages, poser vos propres questions et recevoir la newsletter

Entrée/Sortie Java Discussion :

Performance réseau des classes IO vs NIO


Sujet :

Entrée/Sortie Java

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Membre averti
    Inscrit en
    Décembre 2006
    Messages
    13
    Détails du profil
    Informations forums :
    Inscription : Décembre 2006
    Messages : 13
    Par défaut Performance réseau des classes IO vs NIO
    Bonjour a tous,

    Je développe actuellement une application cliente relativement simple qui a besoin des meilleurs performances possibles coté communication réseau. La cinématique est la suivante:

    1. L'application se connecte et s'authentifie auprès du server
    2. Elle recoit un paquet
    3. Elle decode le paquet en type primitif (au nombre de quatre à quelques dizaines)
    4. On boucle sur le 2

    Comme vous le voyez, les communication ascendante se font uniquement a la connection et le gros du traitement se fait en réception des messages.

    Pour le moment, j'utilise une Socket, un byte array, et la classe DataInputStream. J'ai testé avec les nouvelles classes nio SocketChannel et ByeBuffer en espérant avoir un gain de performance significatif... Mais les perfs sont désastreuses!

    Pour 5000000 paquet avec les io
    time=5785ms avg=0.001157
    time=7329ms avg=0.0014658
    time=5541ms avg=0.0011082

    Pour 5000 paquets avec les nios
    time=136ms avg=0.00272
    time=135ms avg=0.0027

    Es ce normal? J'ai du louper quelques choses? Je pensais la classe ByteBuffer imbatable niveau performances...

    Voici le code:

    io
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    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
    33
    34
    		Socket m_socket;
    		InputStream	m_inputStream;
     
    		m_socket = new Socket();
     
    		try{
    			m_socket.setReceiveBufferSize(1024*1024);
    			m_socket.setSendBufferSize(1024*1024);
     
    			m_socket.connect(new InetSocketAddress("server", 8081) );
    			m_inputStream = new DataInputStream(m_socket.getInputStream());		
     
    			byte my_bytes[] = new byte[16]; 
     
    			long start_time = System.nanoTime();		
    			for(int i= 0; i < 50000; i++)
    			{
    				readBytes(m_inputStream,my_bytes);
     
    				DataInputStream m_decode_stream = new DataInputStream (new ByteArrayInputStream (my_bytes));
    				int an_int = m_decode_stream.readInt();
    				int another_int = m_decode_stream.readInt();
    				double a_double = m_decode_stream.readDouble();
    			}
     
    			long result = (System.nanoTime()-start_time)/1000000;
     
    			System.out.println("time="+result+" avg="+((float)result/(float)50000));
     
    		}
    		catch(IOException ioEx){
    			ioEx.printStackTrace();
    			return;
    		}
    et nio
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    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
    33
    34
    35
    36
    37
    38
    39
    40
    41
    42
    		SocketChannel					m_socket;
    		try{
    			m_socket = SocketChannel.open();
    			m_socket.configureBlocking(true);
    			m_socket.connect(new InetSocketAddress("server", 8081));
     
    			m_socket.socket().setReceiveBufferSize(1024*1024);
    			m_socket.socket().setSendBufferSize(1024*1024);
     
    			ByteBuffer my_data = ByteBuffer.allocateDirect(1024);
     
    			my_data.limit(16);
     
    			long start_time = System.nanoTime();		
    			for(int i= 0; i < 50000; i++)
    			{
    				my_data.clear();
    				my_data.limit(16);
    				readBytes(m_socket,my_data);
    				my_data.flip();
     
    				if( my_data.limit() == 16 )
    				{
    					int an_int = my_data.getInt();
    					int another_int = my_data.getInt();
    					double a_double = my_data.getDouble();
    				}
    				else
    				{
    					System.err.println("disconnected..");
    					break;
    				}
    			}
     
    			long result = (System.nanoTime()-start_time)/1000000;
     
    			System.out.println("time="+result+" avg="+((float)result/(float)50000));
    		}
    		catch(IOException ioEx){
    			ioEx.printStackTrace();
    			return;
    			}

  2. #2
    Membre averti
    Inscrit en
    Décembre 2006
    Messages
    13
    Détails du profil
    Informations forums :
    Inscription : Décembre 2006
    Messages : 13
    Par défaut
    Personne pour une discussion un peu plus haut niveau que les questions de newby habituellement posées sur ce forum?

  3. #3
    Modérateur
    Avatar de dinobogan
    Homme Profil pro
    ingénieur
    Inscrit en
    Juin 2007
    Messages
    4 073
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 44
    Localisation : France

    Informations professionnelles :
    Activité : ingénieur
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Juin 2007
    Messages : 4 073
    Par défaut
    Citation Envoyé par Kher78 Voir le message
    Personne pour une discussion un peu plus haut niveau que les questions de newby habituellement posées sur ce forum?
    Ah bah non, grand maitre. Tu sais, nous, on réponds aux newbies parce que c'est facile. On est aussi des newbies. Alors quand tu sors des termes techniques super compliqués, on est largué. Votre grande magnificence devrait recherché un forum plus adaptés, ne s'embarassant pas des newbies qui posent des questions bêtes

    PS : je suis un troll affamé
    N'oubliez pas de consulter les FAQ Java et les cours et tutoriels Java
    Que la force de la puissance soit avec le courage de ta sagesse.

  4. #4
    Expert confirmé
    Avatar de sinok
    Profil pro
    Inscrit en
    Août 2004
    Messages
    8 765
    Détails du profil
    Informations personnelles :
    Âge : 45
    Localisation : France, Paris (Île de France)

    Informations forums :
    Inscription : Août 2004
    Messages : 8 765
    Par défaut
    Juste comme ça pour voir, tu fais ta lecture comment, car à aucun moment on ne voit le contenu de la méthode readBytes.

Discussions similaires

  1. Problème sur controle des performances réseau
    Par la_praline dans le forum C#
    Réponses: 3
    Dernier message: 28/07/2009, 10h45
  2. [Performance] Codage des classes
    Par mic79 dans le forum Langage
    Réponses: 4
    Dernier message: 14/11/2008, 15h39
  3. Créer les get et set des classes
    Par cameleon2002 dans le forum JBuilder
    Réponses: 3
    Dernier message: 17/09/2003, 21h03
  4. specifier les chemins des .class
    Par draken dans le forum Eclipse Java
    Réponses: 2
    Dernier message: 29/07/2003, 09h35
  5. Inserer des classes java existantes
    Par 2000 dans le forum Eclipse Java
    Réponses: 2
    Dernier message: 20/03/2003, 12h35

Partager

Partager
  • Envoyer la discussion sur Viadeo
  • Envoyer la discussion sur Twitter
  • Envoyer la discussion sur Google
  • Envoyer la discussion sur Facebook
  • Envoyer la discussion sur Digg
  • Envoyer la discussion sur Delicious
  • Envoyer la discussion sur MySpace
  • Envoyer la discussion sur Yahoo