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

Java Discussion :

Optimisation d'une petite fonction très importante


Sujet :

Java

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Membre averti
    Homme Profil pro
    Inscrit en
    Mai 2011
    Messages
    17
    Détails du profil
    Informations personnelles :
    Sexe : Homme

    Informations forums :
    Inscription : Mai 2011
    Messages : 17
    Par défaut Optimisation d'une petite fonction très importante
    Salut tout le monde, je suis débutant en Java (j'ai les bases, je programme en plusieurs langages) et j'ai un serveur (Multi-thread, tcp) qui reçoit environs à peu après 900 Joueurs de connectés simultanément.

    Tout va bien, le serveur supporte ça très bien (Sur une machine 64bits assez puissante) mais j'ai remarquer qu'au bout de quelques heurs après avoir lancer le serveur, souvent (très souvent) cette fonction finit par mettre trop de temps pour répondre et terminer. Cette fonction (send()) est la fonction qui réponds les joueurs (envoie les packets), c'est à dire la fonction la plus appelé, donc j'aimerais qu'elle soit optimisé le plus possible:

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
     
    public static void send(Personnage player, String packet)
    {
    	if(player.get_compte() == null) return;
    	if(player.get_compte().getGameThread() == null) return;
    	PrintWriter out = player.get_compte().getGameThread().get_out();
    	if(out != null && !packet.equals("") && !packet.equals(""+(char)0x00))
    	{
    		packet = CrypterManager.toUtf(packet);
    		out.print((packet)+(char)0x00);
    		out.flush();
    	}
    }

    Ce que j'ai remarquer après plusieurs tentative de débug du temps de réponses, c'est que:


    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    out.print((packet)+(char)0x00);
    Et surtout surtout cette partie:


    Mets trop de temps ! Des fois ça mets 6 secondes, des fois sa met 100 secondes, des fois 600, etc, je capte pas D'où peut venir le problème ? Comment corriger ça? Pourtant mon serveur (Windows) dépasse pas 10% de l'utilisation de son processeur! Besoin d’explications et d'idée merci.

  2. #2
    Membre averti
    Homme Profil pro
    Inscrit en
    Mai 2011
    Messages
    17
    Détails du profil
    Informations personnelles :
    Sexe : Homme

    Informations forums :
    Inscription : Mai 2011
    Messages : 17
    Par défaut
    Quelqu'un a peut être une idée du problème s'il vous plait?

  3. #3
    Modérateur

    Profil pro
    Inscrit en
    Septembre 2004
    Messages
    12 582
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Septembre 2004
    Messages : 12 582
    Par défaut
    Mais justement, là c'est sûrement pas une question de processeur, mais de communication réseau -_-°.

    Après, pourquoi elle met autant de temps j'en sais rien, je sais pas ce que c'est, moi, ton getGameThread().get_out() .

    Par exemple, on peut supposer que tu ne fermes jamais la connexion avec les clients. Ce qui fait que s'ils perdent la connexion pendant qu'ils jouent, toute tentative de communication avec eux sera impossible et durera indéfiniment (ou du moins jusqu'à ce qu'un timeout quelconque interrompe la tentative.)
    Ce n'est qu'une possibilité parmi tant d'autres. Les réseaux c'est pas de la gnognotte.
    N'oubliez pas de consulter les FAQ Java et les cours et tutoriels Java

  4. #4
    Membre averti
    Homme Profil pro
    Inscrit en
    Mai 2011
    Messages
    17
    Détails du profil
    Informations personnelles :
    Sexe : Homme

    Informations forums :
    Inscription : Mai 2011
    Messages : 17
    Par défaut
    Merci thelvin pour ta réponse, le problème parait plus logique maintenant. Tu as peut être raison.

    Pour le getGameThread().get_out(). C'est une method qui retourne ceci:

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
     
    public PrintWriter get_out() {
    	return _out;
    }
     
    // Et le _out vient d'un truc comme ça:
    _out = new PrintWriter(_socket.getOutputStream());
    Comment pourrais-je faire pour tester ton idée, et vérifier si le (la) socket est vivant et connecté avant d'envoyer ?

    Est-ce que cette nouvelle ligne de code devrait suffire pour corriger le problème à ton avis?

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
     
    if (!_socket.isConnected()) return;

  5. #5
    Membre averti
    Homme Profil pro
    Inscrit en
    Mai 2011
    Messages
    17
    Détails du profil
    Informations personnelles :
    Sexe : Homme

    Informations forums :
    Inscription : Mai 2011
    Messages : 17
    Par défaut
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    if (!_socket.isConnected()) return;
    ça ne répare toujours pas mon problème

    Peut être que c'est due au nombre de threads? Car j'alloue à chaque joueur connécté son propre thread. ça peut être ça la cause? 900 threads?

    Tout ce que je cherche c'est un moyen de pousser le: out.flush() (ou .print()) à ne pas dépasser ~500 Millisecondes. Car sinon le serveur commence à lagger pour un rien...

  6. #6
    Membre éclairé
    Profil pro
    Inscrit en
    Juin 2006
    Messages
    351
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juin 2006
    Messages : 351
    Par défaut
    Le problème ne vient surement pas des 900 threads (quoi que ^^) mais bon la faut vraiment arrêter , faut que tu reprennes absolument le code de ton serveur , il faut pas utiliser un thread par client. Il faut que tu utilises un pool de threads , et aussi passe au package nio , ne reste pas sur le package io pour un serveur de jeu.

    Cette ligne me parait vraiment bizar :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
     
    player.get_compte().getGameThread().get_out();
    C'est quoi la logique de fonctionnement derrière getGameThread() ?

Discussions similaires

  1. [ASE]optimisation d'une proc stock trés lente
    Par 461219 dans le forum Adaptive Server Enterprise
    Réponses: 8
    Dernier message: 04/01/2008, 13h23
  2. ASP besoin d'une petite fonction
    Par nicodu59 dans le forum ASP
    Réponses: 3
    Dernier message: 15/08/2007, 00h25
  3. Problème avec une petite fonction toute bête
    Par jeremy13 dans le forum MATLAB
    Réponses: 3
    Dernier message: 18/01/2007, 09h10
  4. une petite question tres importante
    Par gregsix dans le forum Flash
    Réponses: 4
    Dernier message: 29/11/2006, 10h28
  5. Réponses: 2
    Dernier message: 05/09/2006, 00h47

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