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 :

COW copy on write


Sujet :

C++

  1. #1
    Membre expérimenté
    Profil pro
    Inscrit en
    Juin 2006
    Messages
    1 354
    Détails du profil
    Informations personnelles :
    Âge : 48
    Localisation : France

    Informations forums :
    Inscription : Juin 2006
    Messages : 1 354
    Points : 1 419
    Points
    1 419
    Par défaut COW copy on write
    bonjour,

    il y a un certain temps, quelqu'un de Trolltech (Nokia) avait fait un benchmark pour mesurer l'impact du COW et demontrer que c'etait une bonne solution.

    voici le lien:
    http://labs.trolltech.com/blogs/2006...it-worth-it-2/

    Que pensez-vous du benchmark et avez-vous changé d'avis?

    ps: ci-joint les sources pour Qt 4.4.1
    Fichiers attachés Fichiers attachés

  2. #2
    yan
    yan est déconnecté
    Rédacteur
    Avatar de yan
    Homme Profil pro
    Ingénieur expert
    Inscrit en
    Mars 2004
    Messages
    10 033
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 42
    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 033
    Points : 13 968
    Points
    13 968
    Par défaut
    Citation Envoyé par epsilon68 Voir le message
    avez-vous changé d'avis?
    Comment cela?

  3. #3
    Alp
    Alp est déconnecté
    Expert éminent sénior

    Avatar de Alp
    Homme Profil pro
    Inscrit en
    Juin 2005
    Messages
    8 575
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 35
    Localisation : France, Bouches du Rhône (Provence Alpes Côte d'Azur)

    Informations forums :
    Inscription : Juin 2005
    Messages : 8 575
    Points : 11 860
    Points
    11 860
    Par défaut
    Je pense que ça peut valoir le coup, cf les 3 GOTW qu'il donne en lien. Ca dépend de ce que tu implémentes avec COW aussi...

  4. #4
    screetch
    Invité(e)
    Par défaut
    ca depend aussi si ca resiste bien au multi thread a haut nombre de threads

  5. #5
    Membre expérimenté
    Profil pro
    Inscrit en
    Juin 2006
    Messages
    1 354
    Détails du profil
    Informations personnelles :
    Âge : 48
    Localisation : France

    Informations forums :
    Inscription : Juin 2006
    Messages : 1 354
    Points : 1 419
    Points
    1 419
    Par défaut
    Citation Envoyé par Mongaulois Voir le message
    Comment cela?
    beaucoup de personnes critiquent Qt pour le COW donc j'aimerais savoir s'ils ont changé d'avis...

  6. #6
    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
    Points : 4 625
    Points
    4 625
    Par défaut
    Le COW ça ne sert qu'à améliorer la performance dans le cas où l'application fait des copies alors qu'elle n'en a pas besoin.
    Donc si l'application est bien conçue, elle qu'elle ne fait que des copies quand elle en a besoin, alors ça ne sert à rien, au contraire ça rajoute un coût en performance.

    Après ça peut quand même être utile pour faire du partage implicite de parties de structures de données à base de nœuds, mais c'est un cas qui se traite vraiment à part.
    Boost ftw

  7. #7
    Membre expérimenté
    Profil pro
    Inscrit en
    Juin 2006
    Messages
    1 354
    Détails du profil
    Informations personnelles :
    Âge : 48
    Localisation : France

    Informations forums :
    Inscription : Juin 2006
    Messages : 1 354
    Points : 1 419
    Points
    1 419
    Par défaut
    ca permet aussi d'avoir une syntaxe plus legere dans le code...

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    auto_ptr<MonSuperLourdObjet> creerMonObjet()
    vs
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    MonSuperLourdObject creerMonObjet()
    non ? qu'en pensez-vous ?

  8. #8
    yan
    yan est déconnecté
    Rédacteur
    Avatar de yan
    Homme Profil pro
    Ingénieur expert
    Inscrit en
    Mars 2004
    Messages
    10 033
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 42
    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 033
    Points : 13 968
    Points
    13 968
    Par défaut
    Citation Envoyé par epsilon68 Voir le message
    beaucoup de personnes critiquent Qt pour le COW donc j'aimerais savoir s'ils ont changé d'avis...
    Si tu aurais un lien sur cela, ça m'intéresse.
    Pour moi je trouve que c'est un très bon compromis et que cela simplifie beaucoup de question.

    Par exemple :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
     
    QStringList list;
    list<<"aa"<<"bb";
    QStringListModel modelList(list);
     
    QStringList list2 =modelList.stringList () ;
    La même memoire sera utilisé tant que cette mémoire ne doit pas être modifié.

    Cela à encore plus d'utilité avec l'utilisation de slot entre thread. Si cela peut eviter une copi inutile, et cela sans que personne s'en aperçoive!!!

    Pour moi c'est un comme une référence intelligente
    [edit]
    mais qui as un coup.

  9. #9
    Membre expérimenté
    Profil pro
    Inscrit en
    Juin 2006
    Messages
    1 354
    Détails du profil
    Informations personnelles :
    Âge : 48
    Localisation : France

    Informations forums :
    Inscription : Juin 2006
    Messages : 1 354
    Points : 1 419
    Points
    1 419
    Par défaut
    Citation Envoyé par Mongaulois Voir le message
    Si tu aurais un lien sur cela, ça m'intéresse.
    oui ... principalement celle-la :
    http://www.developpez.net/forums/d196604/c-cpp/bibliotheques/boost-vs-qt/


    puis partant du COW, je m'etais demandé pour les collections de Qt s'il ne fallait pas les utiliser car je ne trouve (trouvais) pas efficace de renvoyer une collection STL ni elegant de la passer en parametre:
    http://www.developpez.net/forums/d34...-tulip-vs-stl/

    et toi ? preferes-tu la STL ou Qt Tulip?

  10. #10
    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
    Points : 4 625
    Points
    4 625
    Par défaut
    Je vois pas le rapport entre le COW et le retour par valeur...

    Le retour par valeur fait au pire un déplacement en C++0x (une copie en C++03), et fait dans les bons cas rien du tout grâce à la NRVO.

    Retourner par valeur, c'est bien.
    Boost ftw

  11. #11
    Membre expérimenté
    Profil pro
    Inscrit en
    Juin 2006
    Messages
    1 354
    Détails du profil
    Informations personnelles :
    Âge : 48
    Localisation : France

    Informations forums :
    Inscription : Juin 2006
    Messages : 1 354
    Points : 1 419
    Points
    1 419
    Par défaut
    je ne suis pas d'accord. (voir le 2ieme lien)
    avec gcc, la collection n'est pas copiee que si on fait une affectation par initialisation:

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    vector<string> stringlist = createMyStringList();
    mais pas

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    vector<string> stringlist;
    stringlist = createMyStringList();
    alors retourner par copie, non si on se tape les recopies, et attention au compilateur qui n'optimiserait pas ...

  12. #12
    Alp
    Alp est déconnecté
    Expert éminent sénior

    Avatar de Alp
    Homme Profil pro
    Inscrit en
    Juin 2005
    Messages
    8 575
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 35
    Localisation : France, Bouches du Rhône (Provence Alpes Côte d'Azur)

    Informations forums :
    Inscription : Juin 2005
    Messages : 8 575
    Points : 11 860
    Points
    11 860
    Par défaut
    D'où l'intérêt du COW.

    Mais (en supposant que j'ai bien compris) en C++0x l'intérêt du COW sera quasi nul (réécrire Qt en C++0x ? ).

  13. #13
    yan
    yan est déconnecté
    Rédacteur
    Avatar de yan
    Homme Profil pro
    Ingénieur expert
    Inscrit en
    Mars 2004
    Messages
    10 033
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 42
    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 033
    Points : 13 968
    Points
    13 968
    Par défaut
    Citation Envoyé par Alp Voir le message
    Mais (en supposant que j'ai bien compris) en C++0x l'intérêt du COW sera quasi nul (réécrire Qt en C++0x ? ).

    pourquoi??

  14. #14
    Membre éclairé Avatar de HanLee
    Profil pro
    Inscrit en
    Mai 2004
    Messages
    738
    Détails du profil
    Informations personnelles :
    Âge : 37
    Localisation : France, Rhône (Rhône Alpes)

    Informations forums :
    Inscription : Mai 2004
    Messages : 738
    Points : 871
    Points
    871
    Par défaut
    Citation Envoyé par Mongaulois Voir le message

    pourquoi??
    Grâce à la "move semantic".

  15. #15
    Alp
    Alp est déconnecté
    Expert éminent sénior

    Avatar de Alp
    Homme Profil pro
    Inscrit en
    Juin 2005
    Messages
    8 575
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 35
    Localisation : France, Bouches du Rhône (Provence Alpes Côte d'Azur)

    Informations forums :
    Inscription : Juin 2005
    Messages : 8 575
    Points : 11 860
    Points
    11 860
    Par défaut
    Citation Envoyé par HanLee Voir le message
    Grâce à la "move semantic".
    Tout à fait, grâce à la sémantiquement de mouvement et rvalue references.

  16. #16
    Membre expérimenté
    Profil pro
    Inscrit en
    Juin 2006
    Messages
    1 354
    Détails du profil
    Informations personnelles :
    Âge : 48
    Localisation : France

    Informations forums :
    Inscription : Juin 2006
    Messages : 1 354
    Points : 1 419
    Points
    1 419
    Par défaut
    Citation Envoyé par Alp Voir le message
    Tout à fait, grâce à la sémantiquement de mouvement et rvalue references.
    ca donnerait donc si je ne m'abuse:

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    MonSuperLourdObject&& creerMonObjet()
    j'ai l'impression que ca va être super facile à utiliser et super agreable à lire le code

  17. #17
    yan
    yan est déconnecté
    Rédacteur
    Avatar de yan
    Homme Profil pro
    Ingénieur expert
    Inscrit en
    Mars 2004
    Messages
    10 033
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 42
    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 033
    Points : 13 968
    Points
    13 968
    Par défaut
    Citation Envoyé par Alp Voir le message
    Tout à fait, grâce à la sémantiquement de mouvement et rvalue references.
    mais l'intêret du cow c'est bien plus que cela, sinon ca sert à rien!!!!!


    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
     QPixmap p1, p2;
     p1.load("image.bmp");
     p2 = p1;                        // p1 and p2 share data
    ben tant que p1 et p2 ne sont pas modifié, ils ont la même memoire partagé
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    QPainter paint;
     paint.begin(&p2);               // cuts p2 loose from p1
     paint.drawText(0,50, "Hi");
     paint.end();
    On modifie p2, la memoire ne peut plus être partager. donc une copie de la memoire est faite pour p2 et on modifie p2.

    C'est ca qui rend interessant le cow : ne pas dupliquer de la memoire pour rien, et juste dupliquer quand il faut!!!

    Citation Envoyé par loufoque Voir le message
    Le COW ça ne sert qu'à améliorer la performance dans le cas où l'application fait des copies alors qu'elle n'en a pas besoin.
    Donc si l'application est bien conçue, elle qu'elle ne fait que des copies quand elle en a besoin, alors ça ne sert à rien, au contraire ça rajoute un coût en performance.
    C'est vrai et faux. je ne pense pas que l'on puisse toujours savoir quand un objet doit être copié. C'est un compromis. Tous le monde n'étant pas de super spécialiste, Qt permet des faire du code ayant de trés bonne perf, sans que les gens se casse la tête sur le fait de copier ou non un objet


    Citation Envoyé par loufoque Voir le message
    Après ça peut quand même être utile pour faire du partage implicite de parties de structures de données à base de nœuds, mais c'est un cas qui se traite vraiment à part.
    j'ai pas compris

  18. #18
    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
    Points : 4 625
    Points
    4 625
    Par défaut
    La syntaxe pour retourner un objet c'est pas
    MonSuperLourdObject&& creerMonObjet()
    mais
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    MonSuperLourdObject creerMonObjet()
    creerMonObjet() est une rvalue, donc ça se déplace.
    Boost ftw

  19. #19
    Membre expérimenté
    Profil pro
    Inscrit en
    Juin 2006
    Messages
    1 354
    Détails du profil
    Informations personnelles :
    Âge : 48
    Localisation : France

    Informations forums :
    Inscription : Juin 2006
    Messages : 1 354
    Points : 1 419
    Points
    1 419
    Par défaut
    justement je ne pense pas que ce soit fait automatiquement comme tu l'ecris-

  20. #20
    Alp
    Alp est déconnecté
    Expert éminent sénior

    Avatar de Alp
    Homme Profil pro
    Inscrit en
    Juin 2005
    Messages
    8 575
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 35
    Localisation : France, Bouches du Rhône (Provence Alpes Côte d'Azur)

    Informations forums :
    Inscription : Juin 2005
    Messages : 8 575
    Points : 11 860
    Points
    11 860
    Par défaut
    C'est justement fait avec std::move (enfin, ce sera fait, c'est dans C++0x uniquement).

Discussions similaires

  1. Fonctionnement du copy on write.
    Par valefor dans le forum Virtualisation
    Réponses: 0
    Dernier message: 20/11/2012, 08h57
  2. 4d Write : impression et nombre de copie
    Par dogawaf dans le forum 4D
    Réponses: 6
    Dernier message: 18/01/2010, 23h08
  3. Réponses: 2
    Dernier message: 10/09/2009, 08h30
  4. copie de fichier en utilisant open,read,write
    Par une_tite_question dans le forum POSIX
    Réponses: 3
    Dernier message: 08/09/2008, 14h55
  5. [C++] Copy-On-Write benchmark
    Par epsilon68 dans le forum C++
    Réponses: 74
    Dernier message: 22/11/2006, 10h38

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