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

SL & STL C++ Discussion :

différence entre itérateur et indice ( [] )


Sujet :

SL & STL C++

  1. #21
    yan
    yan est déconnecté
    Rédacteur
    Avatar de yan
    Homme Profil pro
    Ingénieur expert
    Inscrit en
    Mars 2004
    Messages
    10 035
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 43
    Localisation : France, Ille et Vilaine (Bretagne)

    Informations professionnelles :
    Activité : Ingénieur expert
    Secteur : High Tech - Multimédia et Internet

    Informations forums :
    Inscription : Mars 2004
    Messages : 10 035
    Par défaut
    Citation Envoyé par Sylvain Togni Voir le message
    Ah ouais, ce qui se passe c'est que j'avais enlevé les vérifications que rajoute visual par défaut même en release (_SECURE_SCL=0). Comme ça les 3 boucles génèrent le même code asm et sont donc aussi rapides.

    En laissant les vérifications, par contre, for_each est un peu plus rapide car les vérifications de validité des itérateurs sont effectuées qu'une fois au début de la fonction (sur begin et end) pour for_each mais une fois par itération (sur it) pour les deux boucles.
    Ceci explique cela, merci.
    A mon avis visual ne doit pas être le seul compilateur qui fait cela.
    Malgré tout, je resterais sur l'idée de privilégier les algo pour être tranquille.

  2. #22
    yan
    yan est déconnecté
    Rédacteur
    Avatar de yan
    Homme Profil pro
    Ingénieur expert
    Inscrit en
    Mars 2004
    Messages
    10 035
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 43
    Localisation : France, Ille et Vilaine (Bretagne)

    Informations professionnelles :
    Activité : Ingénieur expert
    Secteur : High Tech - Multimédia et Internet

    Informations forums :
    Inscription : Mars 2004
    Messages : 10 035
    Par défaut

    je viens de tester le code corrigé sous mingw.
    pour un vector et une liste, for_each est 50% plus rapide que la boucle for...
    j'ai beau vérifier, le résultat ne change pas.
    Quelqu'un aurais un explication?


    Avec visual express 2008, c'est pareil sans désactiver les sécurités.

  3. #23
    Expert confirmé
    Homme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Décembre 2003
    Messages
    3 549
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Essonne (Île de France)

    Informations professionnelles :
    Activité : Ingénieur développement logiciels

    Informations forums :
    Inscription : Décembre 2003
    Messages : 3 549
    Par défaut
    Mouarf, des tests de perf avec le mode debug de ta bibliothèque standard activé...

    Les benchmarks ça se fait avec toutes optimisations activées. (-O3 -march=native -fomit-frame-pointer -DNDEBUG pour GCC, par exemple)

  4. #24
    yan
    yan est déconnecté
    Rédacteur
    Avatar de yan
    Homme Profil pro
    Ingénieur expert
    Inscrit en
    Mars 2004
    Messages
    10 035
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 43
    Localisation : France, Ille et Vilaine (Bretagne)

    Informations professionnelles :
    Activité : Ingénieur expert
    Secteur : High Tech - Multimédia et Internet

    Informations forums :
    Inscription : Mars 2004
    Messages : 10 035
    Par défaut
    Citation Envoyé par loufoque Voir le message
    Mouarf, des tests de perf avec le mode debug de ta bibliothèque standard activé...

    Les benchmarks ça se fait avec toutes optimisations activées. (-O3 -march=native -fomit-frame-pointer -DNDEBUG pour GCC, par exemple)
    J'en suis pas encore à faire des bench en debug...
    Pour mingw, j'utilise code::block.
    Par defaut, il utilise -02.
    J'ai modifié pour qu'il utilise -03 et -fomit-frame-pointer et défini DNDEBUG
    Ça ne change rien...

  5. #25
    Expert confirmé
    Homme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Décembre 2003
    Messages
    3 549
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Essonne (Île de France)

    Informations professionnelles :
    Activité : Ingénieur développement logiciels

    Informations forums :
    Inscription : Décembre 2003
    Messages : 3 549
    Par défaut
    Pour MSVC, il faut désactiver SECURE_SCL machin truc.

  6. #26
    yan
    yan est déconnecté
    Rédacteur
    Avatar de yan
    Homme Profil pro
    Ingénieur expert
    Inscrit en
    Mars 2004
    Messages
    10 035
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 43
    Localisation : France, Ille et Vilaine (Bretagne)

    Informations professionnelles :
    Activité : Ingénieur expert
    Secteur : High Tech - Multimédia et Internet

    Informations forums :
    Inscription : Mars 2004
    Messages : 10 035
    Par défaut
    Je veins d'essayer avec g++ 4.1 sous ubuntu, les temps sont pareil entre les trois methode.

    Y as que mingw...Peut être parce qu'il est basé sur gcc 3??

  7. #27
    Rédacteur/Modérateur
    Avatar de JolyLoic
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Août 2004
    Messages
    5 463
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 51
    Localisation : France, Yvelines (Île de France)

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

    Informations forums :
    Inscription : Août 2004
    Messages : 5 463
    Par défaut
    Citation Envoyé par loufoque Voir le message
    Pour MSVC, il faut désactiver SECURE_SCL machin truc.
    Hélas, c'est une variable que Microsoft préconise de garder, même en release. Et donc on risque d'être obligé de l'utiliser dans des projets (qui utilisent des bibliothèques externes pré-compilées avec ce flag), alors qu'il est nocif sur les performances. L'utiliser pour des benchs ne me semble donc pas idiot.

    Je me demande ce qui a motivé Microsoft à brider les performances de son compilateur, surtout quand on sait l'influence que des benchs de ce type peut avoir sur les développeurs C++.

    Le pire, c'est que sur un prétexte de sécurité, cette option va pousser les gens n'ayant pas le choix à utiliser des tableaux à la C plutôt que des vectors, car la différence de perfs est significative, et donc à choisir une solution bien moins sûre...
    Ma session aux Microsoft TechDays 2013 : Développer en natif avec C++11.
    Celle des Microsoft TechDays 2014 : Bonnes pratiques pour apprivoiser le C++11 avec Visual C++
    Et celle des Microsoft TechDays 2015 : Visual C++ 2015 : voyage à la découverte d'un nouveau monde
    Je donne des formations au C++ en entreprise, n'hésitez pas à me contacter.

  8. #28
    Expert confirmé
    Homme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Décembre 2003
    Messages
    3 549
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Essonne (Île de France)

    Informations professionnelles :
    Activité : Ingénieur développement logiciels

    Informations forums :
    Inscription : Décembre 2003
    Messages : 3 549
    Par défaut
    C'est comme décider de ne pas désactiver les asserts (définir NDEBUG) en release. Certains ne le font pas, tout simplement parce que le code n'a pas été suffisamment testé pour montrer que ces assertions n'arrivent jamais.

  9. #29
    Membre averti
    Profil pro
    Inscrit en
    Mars 2007
    Messages
    27
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Mars 2007
    Messages : 27
    Par défaut
    merci pour les tests, c'est intéressants.

    Si je comprends bien le _SECURE_SCL vérifie à chaque appel de l'iterator, que celui n'a pas dépassé les limites du conteneur, dans le cas d'une boucle for.
    Dans le cas d'un for_each, le compilateur ne fait pas cette vérification.
    c'est ça?

  10. #30
    yan
    yan est déconnecté
    Rédacteur
    Avatar de yan
    Homme Profil pro
    Ingénieur expert
    Inscrit en
    Mars 2004
    Messages
    10 035
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 43
    Localisation : France, Ille et Vilaine (Bretagne)

    Informations professionnelles :
    Activité : Ingénieur expert
    Secteur : High Tech - Multimédia et Internet

    Informations forums :
    Inscription : Mars 2004
    Messages : 10 035
    Par défaut
    Citation Envoyé par ooxoo Voir le message
    Si je comprends bien le _SECURE_SCL vérifie à chaque appel de l'iterator, que celui n'a pas dépassé les limites du conteneur, dans le cas d'une boucle for.
    Dans le cas d'un for_each, le compilateur ne fait pas cette vérification.
    c'est ça?
    En gros oui.
    Le for_each utilise une autre forme de l'iterateur et le compilateur ne fait le test que pour le premier et le dernier iterateur avant la boucle.

    Après, il y as l'optimisation qui peut changer la donne.
    Sous visual 2008 express, le code corrigé donne les même perf pour les trois boucle sur une list ou un vector.

+ Répondre à la discussion
Cette discussion est résolue.
Page 2 sur 2 PremièrePremière 12

Discussions similaires

  1. différence entre itérateurs et operator[]
    Par mirecalu dans le forum C++
    Réponses: 6
    Dernier message: 23/05/2013, 17h29
  2. Différence entre un "bidouilleur" et un Pro ?
    Par christ_mallet dans le forum Débats sur le développement - Le Best Of
    Réponses: 290
    Dernier message: 28/11/2011, 10h53
  3. différence entre 2 indications de temps
    Par bech59 dans le forum Excel
    Réponses: 1
    Dernier message: 03/04/2009, 12h06
  4. Différences entre jmp, jz, jnz, etc
    Par christbilale dans le forum Assembleur
    Réponses: 3
    Dernier message: 05/07/2002, 15h09
  5. Réponses: 3
    Dernier message: 07/05/2002, 16h06

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