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

C# Discussion :

Utilisation des fonctions TPL : Task et Action


Sujet :

C#

  1. #1
    Membre actif Avatar de Masmeta
    Homme Profil pro
    Ing. R&D informatique industrielle
    Inscrit en
    Mai 2006
    Messages
    472
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Côte d'Or (Bourgogne)

    Informations professionnelles :
    Activité : Ing. R&D informatique industrielle
    Secteur : Industrie

    Informations forums :
    Inscription : Mai 2006
    Messages : 472
    Points : 221
    Points
    221
    Par défaut Utilisation des fonctions TPL : Task et Action
    Bonjour,
    J'ai actuellement du code que j'aimerai optimiser en terme de performance.
    Je pensai utilisé les fonctions de paralléllisme Task et Action.
    Je sais utilisé les fonctions Parallel.For et Parallel.Foreach. Cependant pour les fonction Task et Action, je suis bien paumé.

    Voici le bout de code que j'aimerai optimisé :
    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
     
    Byte[] Bmp = new Byte [X]
    Byte[] Output = new Byte[Bmp.Length];
    int max ;                             
    int min;                       
    int diffmax  ;                             
    int diffmin ;                         
     
    max -= 127;                                            
     
    for (int i = 0; i < Bmp.Length; i++)
    {
        if (Bmp[i] > 127)                                  
        {
            interm_1 = (Double)(Bmp[i] - 127);            
            adder = diffmax * ((interm_1 / max));          
            Output[i] = (byte)(Bmp[i] + (byte)(adder));    
        }
        else
        {                                                  
            interm_2 = (Double)(127 - Bmp[i]);           
            lower = diffmin * (interm_2 / min);          
            if (min != 127)
                Output[i] = (byte)(Bmp[i] - (byte)(lower));
            else
                Output[i] = (byte)(Bmp[i]);
        }
    Le but est de réaliser un traitement sur les valeurs de Bmp et stocker celle ci dans Output. En sachant que Bmp est a une taille très importante.
    Est ce que c'est une bonne solution?

    Comment bien implémenté le code avec une méthode Task?


    Merci de votre aide
    "Nulla Tenaci Invia Est Via"
    Aux persévérants aucune route n'est interdite

  2. #2
    Rédacteur/Modérateur


    Homme Profil pro
    Développeur .NET
    Inscrit en
    Février 2004
    Messages
    19 875
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 42
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : Développeur .NET
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Février 2004
    Messages : 19 875
    Points : 39 749
    Points
    39 749
    Par défaut
    Pourquoi veux-tu faire ça avec Task plutôt qu'avec Parallel?

    Parallel.For me semble une solution assez naturelle pour ce traitement : c'est une simple boucle, avec juste des traitements CPU, donc ça devrait bien se paralléliser. Par contre, attention de bien déclarer les variables dans la boucle, et non en dehors comme tu le fais maintenant, sinon elle seront partagées entre tous les threads, ce qui va causer un joyeux bordel

    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
     
    Byte[] Bmp = new Byte [X]
    Byte[] Output = new Byte[Bmp.Length];                                     
     
    Parallel.For(0, Bmp.Length, i =>
    {
        int max ;                             
        int min;                       
        int diffmax  ;                             
        int diffmin ;                         
     
        max = -127;       
        if (Bmp[i] > 127)                                  
        {
            interm_1 = (Double)(Bmp[i] - 127);            
            adder = diffmax * ((interm_1 / max));          
            Output[i] = (byte)(Bmp[i] + (byte)(adder));    
        }
        else
        {                                                  
            interm_2 = (Double)(127 - Bmp[i]);           
            lower = diffmin * (interm_2 / min);          
            if (min != 127)
                Output[i] = (byte)(Bmp[i] - (byte)(lower));
            else
                Output[i] = (byte)(Bmp[i]);
        }
    });
    (j'ai supposé que dans ton code tu voulais dire max = -127, et non max -= 127, sinon ça ne compilerait pas vu que max n'était pas initialisé...)

  3. #3
    Membre actif Avatar de Masmeta
    Homme Profil pro
    Ing. R&D informatique industrielle
    Inscrit en
    Mai 2006
    Messages
    472
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Côte d'Or (Bourgogne)

    Informations professionnelles :
    Activité : Ing. R&D informatique industrielle
    Secteur : Industrie

    Informations forums :
    Inscription : Mai 2006
    Messages : 472
    Points : 221
    Points
    221
    Par défaut
    Citation Envoyé par tomlev Voir le message
    Pourquoi veux-tu faire ça avec Task plutôt qu'avec Parallel?
    Juste pour essayer de maîtriser ses techniques. Les seuls exemples que j'ai trouvé sur l'utilisation de Task sont assez bateau.
    "Nulla Tenaci Invia Est Via"
    Aux persévérants aucune route n'est interdite

Discussions similaires

  1. [VB.NET][Excel] utiliser des fonction Excel comme xlToRight
    Par Alexj51 dans le forum Macros et VBA Excel
    Réponses: 5
    Dernier message: 01/03/2006, 12h10
  2. [Xml/XSl] utiliser des fonction vb
    Par ekmule dans le forum XSL/XSLT/XPATH
    Réponses: 6
    Dernier message: 17/01/2006, 17h28
  3. [hibernate] utilisation des fonctions d'aggregation
    Par osopardo dans le forum Hibernate
    Réponses: 2
    Dernier message: 29/08/2005, 09h41
  4. utilisation des fonctions d'une dll
    Par jackk dans le forum C++
    Réponses: 14
    Dernier message: 15/06/2005, 16h50
  5. Utiliser des fonctions Pascal
    Par Neilos dans le forum C++Builder
    Réponses: 2
    Dernier message: 07/03/2004, 15h43

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