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 :

Passage C->C++ : Différences de performances et de résultat


Sujet :

C++

  1. #21
    Membre confirmé Avatar de skip78
    Profil pro
    Inscrit en
    Juillet 2006
    Messages
    247
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juillet 2006
    Messages : 247
    Par défaut
    Citation Envoyé par white_tentacle Voir le message
    Je me doute que tu ne peux pas poster les deux codes ici, mais néanmoins, pourrais-tu détailler un peu plus ce que tu entends par "passer de C à C++" (par exemple, remplacer les tableaux par des vector, etc...)
    Vraiment rien changé. Je l'ai déjà dit plus haut.
    ---------------------------------------------

    Bon bah grace à vos messages et à ma réaction d'orgeuil, j'ai cérné le problème.

    Ca n'est pas mon apli GTK+, ni mes filtres, qui sont en cause (non mais alors )

    C'est effectivement (j'y pensais hier soir, mais je n'avais pas effectué les tests) la lib que je teste qui à mal supportée la conversion en C.

    En fait, pour être plus précis, je teste un .lib dont la quasi totalité des fonctions sont en C. Seul l'appel des premières fonctions se fait en C++.

    Au départ, mon programme étant en C, je ne pouvais linker la lib à cause de ce court passage en C++. J'ai donc demandé à ce qu'on me file la lib en C.

    Chose faite un peu plus tard => linkage réussi.

    Et dans mon programme en C++, j'ai repris la première lib, celle ou l'appel est en C++.


    Et la, en court circuitant les appels en question, j'obtiens des vitesses d'éxécution quasi similaires en C et en C++
    (0.3 secs / img lors de la première execution et 0.21 secs / img aux traitements suivants (la difference s'expliquant bien entendu par les créations de widgets) en C++ vs 0.28 et 0.21 en C )

    Cela étant dit, les .lib et .dll que je teste (C et C++) possedent effectivement 3 fonctions d'appel qui différent, mais 6500 lignes de code communes ....

    Donc wtf ?


    P.S. certains me parlaient de moyens d'integrer la lib .cpp dans mon programme en C ?

    Je suis preneur dans les deux sens (C vers C++ aussi)

  2. #22
    Membre Expert
    Avatar de white_tentacle
    Profil pro
    Inscrit en
    Novembre 2008
    Messages
    1 505
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Novembre 2008
    Messages : 1 505
    Par défaut
    Cela étant dit, les .lib et .dll que je teste (C et C++) possedent effectivement 3 fonctions d'appel qui différent, mais 6500 lignes de code communes ....

    Donc wtf ?
    Sans code, difficile de dire quoi que ce soit. Deux options :
    - le bug est dans le code différent --> facile à vérifier
    - le bug est un comportement indéfini qui est différent en C et C++ --> là t'es dans la merde .

    J'imagine que tu peux réclamer le code source de la lib, les infos de debug. Isole une image ou le "code C" marche, le "code C++" marche pas, et joue avec le pas à pas du debugger.

    Sinon, tape sur les doigts du fournisseur de ta lib, à priori, le bug serait chez lui.

  3. #23
    screetch
    Invité(e)
    Par défaut
    Je pense que tu devrais dupliquer le code compilé, fonction par fonction
    et a chaque appel de fonction en C++ vérifier que la fonction C avec les mêmes parametres donne le même résultat
    lorsque tu es sur que la premiere fonction fonctionne, porte la deuxieme
    etc etc

    6500 lignes de code c'est pas trop lourd.

  4. #24
    Expert confirmé

    Profil pro
    Inscrit en
    Janvier 2007
    Messages
    10 610
    Détails du profil
    Informations personnelles :
    Âge : 68
    Localisation : France

    Informations forums :
    Inscription : Janvier 2007
    Messages : 10 610
    Billets dans le blog
    2
    Par défaut
    Citation Envoyé par skip78 Voir le message
    P.S. certains me parlaient de moyens d'integrer la lib .cpp dans mon programme en C ?

    Je suis preneur dans les deux sens (C vers C++ aussi)
    Il faudrait connaître les spécificités de C++ utilisées..

    Dans le sens C vers C++, c'est direct pour tout ce qui est calcul, allocations, structures, globales, etc.. Ensuite, on peut transformer des tableaux en std::list.. Pour le reste, je ne suis que "débutant" en C++.

    Dans le sens C++ vers C, il faudrait voir...

  5. #25
    Membre confirmé Avatar de skip78
    Profil pro
    Inscrit en
    Juillet 2006
    Messages
    247
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juillet 2006
    Messages : 247
    Par défaut
    Citation Envoyé par screetch Voir le message
    Je pense que tu devrais dupliquer le code compilé, fonction par fonction
    et a chaque appel de fonction en C++ vérifier que la fonction C avec les mêmes parametres donne le même résultat
    lorsque tu es sur que la premiere fonction fonctionne, porte la deuxieme
    etc etc

    6500 lignes de code c'est pas trop lourd.
    C'est ce que je fais principalement dans mon programme en fait :
    Le principe de base de mon appli est de tester et corriger les libs soumises.

    => Une premiere fois j'appelle la fonction de traitement de la lib en question, qui me retourne un résultat, que j'affiche.

    => Si l'utilisateur le demande, il peut entrer pas à pas dans le traitement généré par la lib => pour cela, j'ai porté toutes les fonctions une par une.

    Mais cela ne peux pas aider pour le C++ vs C car toutes les fonctions sont en C.

    Encore une fois, seul l'appel change, c'est la que ca reste super surprenant.
    Enfin bon, j'en parlerais au responsable dès qu'il sera dans le coin

    Par contre, pour que je puisse poursuivre, je vais rester en C, importer la lib C, qui (je viens de faire une simulation grande echelle) obtient définitivement de meilleurs résultats (82 vs 49 % même si sur certains dossiers, c'est invérsé ... lol) et puis me démerder pour importer les nouvelles libs C++ (je vais les porter en C je pense, bien relou, mais bon faut ce qu'il faut, et puis ca fait bien 1 an que j'ai pas touché au C++ )
    Enfin, au final ce qu'il me faudrait c'est pouvoir importer une lib C dans mon prog Cpp

    Ah et puis pour la vitesse d'éxécution ... surprise :
    Quand je passe pas par Visual (et que j'utilise directement le .exe) c'est 2 fois plus rapide que la version la plus rapide via le compilateur, et ca m'a l'air égal pour les 2 libs ...

    Je fais les tests de suite.

    edit : => 0.108 en cpp vs 0.112 en c sur un échantillon de 200 images. C'est kif kif => Vive la lib C

  6. #26
    Expert confirmé

    Profil pro
    Inscrit en
    Janvier 2007
    Messages
    10 610
    Détails du profil
    Informations personnelles :
    Âge : 68
    Localisation : France

    Informations forums :
    Inscription : Janvier 2007
    Messages : 10 610
    Billets dans le blog
    2
    Par défaut
    Citation Envoyé par skip78 Voir le message
    Par contre, pour que je puisse poursuivre, je vais rester en C, importer la lib C, qui (je viens de faire une simulation grande echelle) obtient définitivement de meilleurs résultats (82 vs 49 % même si sur certains dossiers, c'est invérsé ... lol)

    Fondamentalement, cela indique un bug majeur dans la librairie C++.

    Et c'est sans doute pour ça qu'elle va plus vite : elle ne fait pas un truc essentiel que fait la librairie C..

  7. #27
    Membre confirmé Avatar de skip78
    Profil pro
    Inscrit en
    Juillet 2006
    Messages
    247
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juillet 2006
    Messages : 247
    Par défaut
    Bon bah en tout cas merci à tous d'avoir réagi, ca m'a permis d'avancer un peu

    Et donc par contre, la décision est prise, il faudrait que je puisse intégrer la lib en C à mon programme C++.

    => Comment faire ?

    Je disposes d'un fichier .lib et d'un fichier .dll, et quand je tente de linker, le compilo me sort une erreur de link extern, exactement comme quand je crée un fichier .cpp dans mon programme en c et que j'essaies d'acceder à une fonction définie et écrite dans le fichier en question.

  8. #28
    Expert confirmé

    Inscrit en
    Novembre 2005
    Messages
    5 145
    Détails du profil
    Informations forums :
    Inscription : Novembre 2005
    Messages : 5 145
    Par défaut
    Citation Envoyé par skip78 Voir le message
    Bon bah en tout cas merci à tous d'avoir réagi, ca m'a permis d'avancer un peu

    Et donc par contre, la décision est prise, il faudrait que je puisse intégrer la lib en C à mon programme C++.

    => Comment faire ?

    Je disposes d'un fichier .lib et d'un fichier .dll, et quand je tente de linker, le compilo me sort une erreur de link extern, exactement comme quand je crée un fichier .cpp dans mon programme en c et que j'essaies d'acceder à une fonction définie et écrite dans le fichier en question.
    Il ne manquerait pas un extern "C" autour de la declaration de la fonction C que tu appelles?

  9. #29
    Membre confirmé Avatar de skip78
    Profil pro
    Inscrit en
    Juillet 2006
    Messages
    247
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juillet 2006
    Messages : 247
    Par défaut
    Bah, si
    C'est justement quelque chose comme ca lol
    Mais le problème c'est que je n'y connais rien.
    Et puis la on part du principe que j'ai accès à la librairie en question.

    Disons que je ne peux vraiment pas modifier la lib que je veux linker, et donc qu'elle est en .c
    Comment la linker à mon programme en cpp ?

    (l'erreur précise est la suivante :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
     
    1>image_processing.obj : error LNK2019: symbole externe non résolu "char * __cdecl MaFonction(unsigned char *,int,int,int)" (?MaFonction@@YAPADPAEHHH@Z) référencé dans la fonction "char * __cdecl FonctionD_Appel(struct _GtkWidget *)" (?FonctionD_Appel@@YAPADPAU_GtkWidget@@@Z)
    1>C:\Users\mobiletag\Desktop\Projet\MonProjet\MonProjet_1.3\Debug\MonProjet_1.3.exe : fatal error LNK1120: 1 externes non résolus

  10. #30
    Expert éminent
    Avatar de Médinoc
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Septembre 2005
    Messages
    27 401
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 41
    Localisation : France

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

    Informations forums :
    Inscription : Septembre 2005
    Messages : 27 401
    SVP, pas de questions techniques par MP. Surtout si je ne vous ai jamais parlé avant.

    "Aw, come on, who would be so stupid as to insert a cast to make an error go away without actually fixing the error?"
    Apparently everyone.
    -- Raymond Chen.
    Traduction obligatoire: "Oh, voyons, qui serait assez stupide pour mettre un cast pour faire disparaitre un message d'erreur sans vraiment corriger l'erreur?" - Apparemment, tout le monde. -- Raymond Chen.

  11. #31
    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
    Tu dois invoquer des comportements indéfinis à la pelle.
    Utilise valgrind pour t'aider à en déboguer certains.

Discussions similaires

  1. Réponses: 9
    Dernier message: 19/05/2009, 23h42
  2. Réponses: 14
    Dernier message: 12/04/2009, 21h47
  3. Différence de performance en FULLSCREEN et WINDOWED ?
    Par supergrey dans le forum DirectX
    Réponses: 9
    Dernier message: 09/03/2008, 18h40
  4. Différence de performance entre JOIN et Subselect ?
    Par guidav dans le forum Requêtes
    Réponses: 1
    Dernier message: 20/07/2007, 11h01
  5. Réponses: 7
    Dernier message: 11/07/2007, 23h01

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