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 :

[C#] cast vs conversion explicite, optimisation


Sujet :

C#

  1. #1
    Candidat au Club
    Profil pro
    Inscrit en
    Juillet 2007
    Messages
    5
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juillet 2007
    Messages : 5
    Points : 4
    Points
    4
    Par défaut [C#] cast vs conversion explicite, optimisation
    hello,

    j'aimerais savoir quelle est la manière la plus performante pour caster un objet d'un type vers un autre sachant que le cast n'échouera jamais.

    voici typiquement ce que je fais sur list qui est une instance de List<T>

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
     
    lock (((ICollection)list).SyncRoot)
    {
    ...
    }
    ou
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
     
    lock ((list as ICollection).SyncRoot)
    {
    ...
    }
    j'aurais eu tendance à dire que l'opérateur de conversion explicite (le C-style cast) était plus rapide que le dynamic_cast, malheureusement, un message sur un forum datant de 2003 disait le contraire ; cependant, ce message concernait .net 1...

    Qu'en est-il pour .net >= 2 ?

    merci d'avance

  2. #2
    Expert éminent sénior

    Avatar de Philippe Vialatte
    Homme Profil pro
    Architecte technique
    Inscrit en
    Juillet 2004
    Messages
    3 029
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 46
    Localisation : France, Alpes Maritimes (Provence Alpes Côte d'Azur)

    Informations professionnelles :
    Activité : Architecte technique
    Secteur : High Tech - Produits et services télécom et Internet

    Informations forums :
    Inscription : Juillet 2004
    Messages : 3 029
    Points : 12 465
    Points
    12 465
    Par défaut
    personnellement, j'aurais tendance a dire qu'on s'en moque...

    ca ressemble a de la micro-optimisation, a vue de nez, a moins d'appeler 1 000 000 de fois le lock, tu ne gagneras rien a faire l'un ou l'autre...

    enfin, c'est mon avis a moi, et je le partage avec moi-meme...

  3. #3
    Membre actif
    Profil pro
    Inscrit en
    Juillet 2006
    Messages
    262
    Détails du profil
    Informations personnelles :
    Âge : 39
    Localisation : France, Paris (Île de France)

    Informations forums :
    Inscription : Juillet 2006
    Messages : 262
    Points : 230
    Points
    230
    Par défaut
    Salut,

    il y a apperement quelques differences detaillees dans cet article: (en anglais)

    http://gen5.info/q/2008/06/13/prefix...-casting-in-c/

    A+

  4. #4
    Candidat au Club
    Profil pro
    Inscrit en
    Juillet 2007
    Messages
    5
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juillet 2007
    Messages : 5
    Points : 4
    Points
    4
    Par défaut
    Citation Envoyé par pvialatte Voir le message
    personnellement, j'aurais tendance a dire qu'on s'en moque...
    Je préfère connaitre les mécanismes du langage correctement.

    Citation Envoyé par pvialatte Voir le message
    ca ressemble a de la micro-optimisation, a vue de nez, a moins d'appeler 1 000 000 de fois le lock, tu ne gagneras rien a faire l'un ou l'autre...
    Oui et non, c'est une zone du code qui pourrait potentiellement être invoquée 1 000 000 de fois.

  5. #5
    Candidat au Club
    Profil pro
    Inscrit en
    Juillet 2007
    Messages
    5
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juillet 2007
    Messages : 5
    Points : 4
    Points
    4
    Par défaut
    Citation Envoyé par toxycyty Voir le message
    Salut,

    il y a apperement quelques differences detaillees dans cet article: (en anglais)

    http://gen5.info/q/2008/06/13/prefix...-casting-in-c/

    A+
    je suis bon pour changer tous mes casts, le dynamic_cast étant 5 fois plus rapide que la conversion explicite.
    Encore merci pour vos réponses et cet article qui met fin à cette discussion.

    yohan

  6. #6
    Expert éminent sénior

    Avatar de Philippe Vialatte
    Homme Profil pro
    Architecte technique
    Inscrit en
    Juillet 2004
    Messages
    3 029
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 46
    Localisation : France, Alpes Maritimes (Provence Alpes Côte d'Azur)

    Informations professionnelles :
    Activité : Architecte technique
    Secteur : High Tech - Produits et services télécom et Internet

    Informations forums :
    Inscription : Juillet 2004
    Messages : 3 029
    Points : 12 465
    Points
    12 465
    Par défaut
    Citation Envoyé par sneakysponge Voir le message
    je suis bon pour changer tous mes casts, le dynamic_cast étant 5 fois plus rapide que la conversion explicite.
    Encore merci pour vos réponses et cet article qui met fin à cette discussion.
    Nyet, pas d'accord, ce que je soulevais rete valide...

    Si tu lis l'article, tu vois que sur 29 millions de cast, tu as une différence de 600 millisecondes...si c'est ce qui te ralentit le plus, tu as une sacrée chance

    Ça reste de la micro-optimisation, j'insiste

    En plus, j'avais lu en travers, mais, dans ton exemple, si ta liste implémente ICollection, le cast est, en plus, inutile...vu que justement, l'intérêt d'utiliser une interface, c'est de s'assurer que les classes implémentant l'interface remplissent le contrat défini par ton interface...ou sinon, j'ai loupe un train...


    Je préfère connaitre les mécanismes du langage correctement.
    Pour ca, par contre, ok, mais la difference est plus "fonctionelle" que une question de perfs...et en plus, l'article cite sur gen5 a a peu pres cette conclusion, utiliser les cast prefixes...

    En terme de bonne pratique, les exceptions doivent être remontées le plus tôt possible

  7. #7
    Candidat au Club
    Profil pro
    Inscrit en
    Juillet 2007
    Messages
    5
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juillet 2007
    Messages : 5
    Points : 4
    Points
    4
    Par défaut
    Citation Envoyé par pvialatte Voir le message
    En plus, j'avais lu en travers, mais, dans ton exemple, si ta liste implémente ICollection, le cast est, en plus, inutile...vu que justement, l'intérêt d'utiliser une interface, c'est de s'assurer que les classes implémentant l'interface remplissent le contrat défini par ton interface...ou sinon, j'ai loupe un train...
    list est une instance de List<T>, par réflexion, tu verras que List<T> implémente explicitement ICollection, donc le seul moyen d'accéder à son SyncRoot, sauf erreur de ma part, c'est le cast.

  8. #8
    Rédacteur/Modérateur
    Avatar de Skalp
    Homme Profil pro
    Développeur .NET
    Inscrit en
    Novembre 2006
    Messages
    1 694
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Ille et Vilaine (Bretagne)

    Informations professionnelles :
    Activité : Développeur .NET

    Informations forums :
    Inscription : Novembre 2006
    Messages : 1 694
    Points : 2 927
    Points
    2 927
    Par défaut
    Citation Envoyé par pvialatte Voir le message
    En plus, j'avais lu en travers, mais, dans ton exemple, si ta liste implémente ICollection, le cast est, en plus, inutile...vu que justement, l'intérêt d'utiliser une interface, c'est de s'assurer que les classes implémentant l'interface remplissent le contrat défini par ton interface...ou sinon, j'ai loupe un train...
    Citation Envoyé par sneakysponge Voir le message
    list est une instance de List<T>, par réflexion, tu verras que List<T> implémente explicitement ICollection, donc le seul moyen d'accéder à son SyncRoot, sauf erreur de ma part, c'est le cast.
    Vous avez tous les deux raison :

    - Si List<T> implémente ICollection, elle devrait présenter la propriété SyncRoot. Mais ce n'est pas le cas, l'implémentation de ICollection par List<T> cache cette propriété.
    Ne me demandez pas pourquoi, je me pose moi-même déjà cette question !
    - Dans le cas de List<T>, comme cette propriété est cachée par l'implémentation, il faut passer par un cast.


    @sneakysponge : si ta liste ne manipule que des string, je te propose StringCollection qui présente publiquement la propriété SyncRoot (il n'y aurait donc pas besoin de caster dans ce cas).

  9. #9
    Expert éminent sénior

    Avatar de Philippe Vialatte
    Homme Profil pro
    Architecte technique
    Inscrit en
    Juillet 2004
    Messages
    3 029
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 46
    Localisation : France, Alpes Maritimes (Provence Alpes Côte d'Azur)

    Informations professionnelles :
    Activité : Architecte technique
    Secteur : High Tech - Produits et services télécom et Internet

    Informations forums :
    Inscription : Juillet 2004
    Messages : 3 029
    Points : 12 465
    Points
    12 465
    Par défaut
    arf, le boulet, comme je te voyais caster sur une ICollection, j'avais pense a une arraylist...

    Ceci dit, je crois me rappeler que microsoft avait une raison pour ne pas utiliser SyncRoot dans le framework v2.0....faudra que je cherche

  10. #10
    Rédacteur/Modérateur
    Avatar de Skalp
    Homme Profil pro
    Développeur .NET
    Inscrit en
    Novembre 2006
    Messages
    1 694
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Ille et Vilaine (Bretagne)

    Informations professionnelles :
    Activité : Développeur .NET

    Informations forums :
    Inscription : Novembre 2006
    Messages : 1 694
    Points : 2 927
    Points
    2 927
    Par défaut
    Citation Envoyé par pvialatte Voir le message
    Ceci dit, je crois me rappeler que microsoft avait une raison pour ne pas utiliser SyncRoot dans le framework v2.0....faudra que je cherche
    Ca m'intéresse !

  11. #11
    Expert éminent sénior

    Avatar de Philippe Vialatte
    Homme Profil pro
    Architecte technique
    Inscrit en
    Juillet 2004
    Messages
    3 029
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 46
    Localisation : France, Alpes Maritimes (Provence Alpes Côte d'Azur)

    Informations professionnelles :
    Activité : Architecte technique
    Secteur : High Tech - Produits et services télécom et Internet

    Informations forums :
    Inscription : Juillet 2004
    Messages : 3 029
    Points : 12 465
    Points
    12 465
    Par défaut
    J'ai trouve

    http://blogs.msdn.com/bclteam/archiv...15/396399.aspx

    Le but étant de laisser aux développeurs la possibilité de gérer leur propre synchronisation a un niveau plus élevé...

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

Discussions similaires

  1. Conversion cast implicite et mot clef "explicit"
    Par nikopol82 dans le forum Langage
    Réponses: 7
    Dernier message: 08/11/2009, 20h07
  2. conversion (cast) entre IntPtr int[]
    Par glebourg dans le forum C#
    Réponses: 2
    Dernier message: 29/03/2007, 10h03
  3. [Débutant] Deux questions sur la conversion (cast)
    Par kloss dans le forum Langage
    Réponses: 7
    Dernier message: 18/02/2006, 19h46
  4. - [CAST ou CONVERT] Problème de conversion de date
    Par Boublou dans le forum MS SQL Server
    Réponses: 2
    Dernier message: 06/07/2004, 14h31

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