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

avec Java Discussion :

Informations performances multithreading


Sujet :

avec Java

  1. #1
    Nouveau membre du Club
    Inscrit en
    Janvier 2004
    Messages
    48
    Détails du profil
    Informations personnelles :
    Âge : 35

    Informations forums :
    Inscription : Janvier 2004
    Messages : 48
    Points : 28
    Points
    28
    Par défaut Informations performances multithreading
    Bonjour à tous,

    Je débute actuellement en multithreading.

    J'ai fait un petit programme qui retourne un tableau (le premier élément devient le dernier etc.)

    - Mon algorithme en thread unique est :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    static int[] inverse (int[] tab){
    	int[] retour = new int[tab.length];
    	for (int i = 0; i < tab.length; i++)
    	{
    		retour[i] = tab[tab.length -1 -i];
    	}
    	return retour;
    }
    - Mon algorithme pour 3 threads est:

    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
     
    static int[] inverse (int[] tab){
    	int tier = tab.length / 3;
    	ThreadInverse t1 = new ThreadInverse(tab, 0, tier);
    	ThreadInverse t2 = new ThreadInverse(tab, (tier) +1 ,(tier)*2);
    	ThreadInverse t3 = new ThreadInverse(tab, ((tier)*2) + 1, tab.length-1);
    	t1.start();
    	t2.start();
    	t3.start();
     
    	t1.join();
    	t2.join();
    	t3.join();
     
    	return t1.getRetour();
    }
    - et le code source de mon thread est :

    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
    public class ThreadInverse extends Thread
    {
    	private int debut = 0;
    	private int fin = 0;
    	private static int[] tab;
    	private static int[] retour;
     
    	ThreadInverse(int[] tab, int debut, int fin)
    	{
    		this.debut = debut;
    		this.fin = fin;
    		this.tab = tab;
    		this.retour = new int[tab.length];
    	}
     
    	public void run()
    	{
    		for (int i = debut; i <= fin; i++)
    		{
    			retour[i] = tab[tab.length -1 -i];
    		}
    	}
     
    	public int [] getRetour()
    	{
    		return retour;
    	}
    }
    Ca marche parfaitement mais j'ai remarqué que mon programme était beaucoup moins performant en multhreading qu'en thread unique.

    Ma métode de test retourne une suite de tableaux dont la taille augmente de 1 à chaque fois. Je pars d'une taille de 1 et mon test se cloture quand la taille du dernier tableau est à 100 000.

    La performence négative est elle du à toutes les opérations necessaires pour lancer mes threads?

    Pouriez-vous me donner quelques conseils?

    Merci beaucoup pour vos réponses

  2. #2
    Membre expert

    Homme Profil pro
    Consultant informatique
    Inscrit en
    Janvier 2004
    Messages
    2 301
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Suisse

    Informations professionnelles :
    Activité : Consultant informatique
    Secteur : Finance

    Informations forums :
    Inscription : Janvier 2004
    Messages : 2 301
    Points : 3 675
    Points
    3 675
    Par défaut
    il manque un "Thread.yield();" dans la boucle de la méthode run


  3. #3
    Nouveau membre du Club
    Inscrit en
    Janvier 2004
    Messages
    48
    Détails du profil
    Informations personnelles :
    Âge : 35

    Informations forums :
    Inscription : Janvier 2004
    Messages : 48
    Points : 28
    Points
    28
    Par défaut
    A oui c'est vrai j'avais appris cette instruction en plus. Merci.

    Mais malheureusement les performances ont diminuées d'encore 3 fois plus que sans le yiel().

  4. #4
    Membre éprouvé
    Inscrit en
    Mars 2006
    Messages
    848
    Détails du profil
    Informations personnelles :
    Âge : 40

    Informations forums :
    Inscription : Mars 2006
    Messages : 848
    Points : 1 078
    Points
    1 078
    Par défaut
    C'est normal, car en multi-thread, tu effectues les même opérations qu'en mono-thread avec en plus la création/gestion des threads.
    Donc tu ne peux être plus rapide que si tu travailles sur plusieurs processeurs et qu'ils sont correctement exploités, et encore, ça dépend des tâches à effectuer.

    Si tu veux tester l'intérêt du multi-thread, il faut que tu aies des temps de latence (réponse d'une appli tierce, de l'utilisateur, de l'OS, ...) dans les différentes tâches.
    Tu dois pouvoir le simuler en ajoutant un "Thread.sleep(10);" dans la boucle de la méthode inverse.

  5. #5
    Membre éprouvé
    Inscrit en
    Mars 2006
    Messages
    848
    Détails du profil
    Informations personnelles :
    Âge : 40

    Informations forums :
    Inscription : Mars 2006
    Messages : 848
    Points : 1 078
    Points
    1 078
    Par défaut
    Comme je ne suis pas persuadé d'avoir été très clair, je vais imager:

    Tu as trois écrivains (tes 3 threads) qui doivent écrire chacun un paragraphe d'une lettre. Ils ne disposent que d'un stylo (1 processeur).

    S'ils connaissent la lettre à écrire par coeur (= pas de temps de latence), ils iront moins vite qu'un écrivain seul car ils perdront du temps à se passer le crayon.

    Par contre, si chacun doit réfléchir avant chaque phrase (avec temps de latence), ils pourront optimiser le temps : l'un écrira pendant que les autres réfléchiront.

    Là, ils pourront aller plus vite si les temps de réflexion sont important à côté du temps perdu à se passer le crayon.


    Et cette image fonctionne aussi pour expliquer l'utilité d'avoir plusieurs processeurs/stylos

  6. #6
    Nouveau membre du Club
    Inscrit en
    Janvier 2004
    Messages
    48
    Détails du profil
    Informations personnelles :
    Âge : 35

    Informations forums :
    Inscription : Janvier 2004
    Messages : 48
    Points : 28
    Points
    28
    Par défaut
    Ouai ok donc dans mon cas je peux pas aller plus vite qu'avec un seul thread car je n'ai pas de temps de latence entre mes operations et également parce que je n'ai qu'un seul processeur. c'est bien ca?

    Merci beaucoup pour ces informations.

  7. #7
    Modérateur
    Avatar de wax78
    Homme Profil pro
    Chef programmeur
    Inscrit en
    Août 2006
    Messages
    4 084
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 43
    Localisation : Belgique

    Informations professionnelles :
    Activité : Chef programmeur
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Août 2006
    Messages : 4 084
    Points : 7 996
    Points
    7 996
    Par défaut
    Citation Envoyé par Deaf Voir le message
    Comme je ne suis pas persuadé d'avoir été très clair, je vais imager:

    Tu as trois écrivains (tes 3 threads) qui doivent écrire chacun un paragraphe d'une lettre. Ils ne disposent que d'un stylo (1 processeur).

    S'ils connaissent la lettre à écrire par coeur (= pas de temps de latence), ils iront moins vite qu'un écrivain seul car ils perdront du temps à se passer le crayon.

    Par contre, si chacun doit réfléchir avant chaque phrase (avec temps de latence), ils pourront optimiser le temps : l'un écrira pendant que les autres réfléchiront.

    Là, ils pourront aller plus vite si les temps de réflexion sont important à côté du temps perdu à se passer le crayon.


    Et cette image fonctionne aussi pour expliquer l'utilité d'avoir plusieurs processeurs/stylos
    Très bonne explication.

    Pour gagner du temps avec plusieur thread sur une processeur il fautdrati que tu fasses des I/O (par exemple) et que celles ci soient +- bloquantes pour remarquer un gain. Sinon en effet ca sera le contraire qui va se produire (echange du stylo).

+ Répondre à la discussion
Cette discussion est résolue.

Discussions similaires

  1. Réponses: 16
    Dernier message: 01/10/2010, 13h47
  2. Réponses: 2
    Dernier message: 28/07/2010, 13h39
  3. Multithread performant pour du calcul
    Par RenaudM dans le forum Langage
    Réponses: 13
    Dernier message: 22/11/2008, 13h26
  4. STL : informations de performances
    Par Rupella dans le forum SL & STL
    Réponses: 5
    Dernier message: 20/11/2007, 19h20
  5. multithreading et performance
    Par philippe V dans le forum C++
    Réponses: 9
    Dernier message: 20/11/2004, 01h25

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