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 :

Incompréhension du temps d'execution


Sujet :

C++

  1. #1
    Expert confirmé
    Homme Profil pro
    Étudiant
    Inscrit en
    Juin 2012
    Messages
    1 711
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Juin 2012
    Messages : 1 711
    Points : 4 442
    Points
    4 442
    Par défaut Incompréhension du temps d'execution
    Hello,

    Je reprend un ancien projet : création d'une image (chargement d'une font et bin paking pour en faire un atlas), puis création d'un SDF à partir de cet atlas.

    Mon but est de réduire le temps d'exec, plus par curiosité que par nécessité.

    Et là je me retrouve face à un truc bizarre : afficher l'image générée multiplie par 3 son temps de création .

    Mon code ressemble à ça:
    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
    29
    template <class Function>
    void timeIt(Function function, std::string const& desc) {
    	auto startTime = std::chrono::high_resolution_clock::now();
    	function();	
    	auto endTime = std::chrono::high_resolution_clock::now();
    	auto t = std::chrono::duration_cast<std::chrono::duration<double>>(endTime - startTime);
    	std::cout << desc << t.count() << " seconds." << std::endl;
    }
     
    int main(int, char**) {
    	sf::Image atlas;
    	timeIt([&]() {
    		pack(atlas, "sansation_bold.ttf", 600, 32, 4096);
    	}, "Atlas generated in ");
    	atlas.saveToFile("atlas.png");
     
    	sf::Image resultImage;	
    	timeIt([&]() {
    		generateSDFFrom4ChannelsMT(resultImage,
    				"atlas.png",
    				"atlas.png",
    				"atlas.png",
    				"atlas.png",
    				256, 256,
    				centeredLinearDistance(128.)); },
    		"SDF generated in ");
    	resultImage.saveToFile("atlas_4.png");
    	return 0;
    }
    Qui me donne
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    Atlas generated in 0.813719 seconds.
    SDF generated in 2.43448 seconds.
    (Même temps d'exec en autorisant le compilo à générer du code SSE2 ou AVX).

    Maintenant en changeant le code pour devenir
    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
    29
    30
    31
    32
    template <class Function>
    void timeIt(Function function, std::string const& desc) {
    	auto startTime = std::chrono::high_resolution_clock::now();
    	function();	
    	auto endTime = std::chrono::high_resolution_clock::now();
    	auto t = std::chrono::duration_cast<std::chrono::duration<double>>(endTime - startTime);
    	std::cout << desc << t.count() << " seconds." << std::endl;
    }
     
    int main(int, char**) {
    	sf::Image atlas;
    	timeIt([&]() {
    		pack(atlas, "sansation_bold.ttf", 600, 32, 4096);
    	}, "Atlas generated in ");
    	atlas.saveToFile("atlas.png");
     
    	sf::Image resultImage;	
    	timeIt([&]() {
    		generateSDFFrom4ChannelsMT(resultImage,
    				"atlas.png",
    				"atlas.png",
    				"atlas.png",
    				"atlas.png",
    				256, 256,
    				centeredLinearDistance(128.)); },
    		"SDF generated in ");
    	resultImage.saveToFile("atlas_4.png");
     
    	// boucle d'affichage
     
    	return 0;
    }
    Le temps d'exec reste le même avec du code SSE2 (logique), mais est triplé avec du code AVX (atlas : 0.8sec / SDF : 7.3sec).

    Comment est-ce possible que la boucle d'affichage impacte le temps de création du SDF ?

  2. #2
    Expert éminent sénior

    Avatar de dragonjoker59
    Homme Profil pro
    Software Developer
    Inscrit en
    Juin 2005
    Messages
    2 031
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 42
    Localisation : France, Bas Rhin (Alsace)

    Informations professionnelles :
    Activité : Software Developer
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Juin 2005
    Messages : 2 031
    Points : 11 476
    Points
    11 476
    Billets dans le blog
    11
    Par défaut
    On va dire que tout dépend de ce que la boucle d'affichage fait.
    Peut être qu'avec celle-ci le compilo ne génère tout simplement pas de code AVX.
    Si vous ne trouvez plus rien, cherchez autre chose...

    Vous trouverez ici des tutoriels OpenGL moderne.
    Mon moteur 3D: Castor 3D, presque utilisable (venez participer, il y a de la place)!
    Un projet qui ne sert à rien, mais qu'il est joli (des fois) : ProceduralGenerator (Génération procédurale d'images, et post-processing).

  3. #3
    Expert éminent sénior
    Avatar de koala01
    Homme Profil pro
    aucun
    Inscrit en
    Octobre 2004
    Messages
    11 614
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 52
    Localisation : Belgique

    Informations professionnelles :
    Activité : aucun

    Informations forums :
    Inscription : Octobre 2004
    Messages : 11 614
    Points : 30 626
    Points
    30 626
    Par défaut
    Salut,

    Une question sans doute idiote : ne t'amuserais tu pas, tout bêtement, à charger en mémoire quatre fois le même fichier png là où un seul chargement devrait pouvoir suffire (vu que tu donnes chaque fois le même nom de fichier)

    N'aurais tu pas intérêt-- ce n'est qu'une supposition, ne sachant pas ce que fait exactement generateSDFFrom4ChannelsMT -- à repérer les cas où plusieurs fichiers sont identiques afin ne le charger qu'une seule fois et d'utiliser une copie (enfin, un clone plutôt) de la ressource obtenue après extraction pour les différentes étapes à effectuer

    Parce que, si j'ai bien compris (reprends moi si je dis une connerie, je ne m'offusquerai pas ) ta fonction generateSDFFrom4ChannelsMT va travailler sous une forme qui pourrait être proche de:
    1. charger le fichier 1
    2. charger le fichier 2
    3. charger le fichier 3
    4. charger le fichier 4
    5. (éventuellement) appliquer des transformations spécifiques pour
      • la "texture" obtenue depuis le fichier1
      • la "texture" obtenue depuis le fichier2
      • la "texture" obtenue depuis le fichier3
      • la "texture" obtenue depuis le fichier4
    6. calculer le résultat de la combinaison de quatre textures
    Or, l'extraction des données d'un fichier png est -- certes-- relativement facile, il n'en demeure pas moins que... c'est un processus qui prend du temps.

    Cela vaudrait surement la peine d'effectuer un benchmark pour valider mon hypothèse, mais j'ai l'impression que c'est à ce niveau que tout se joue
    A méditer: La solution la plus simple est toujours la moins compliquée
    Ce qui se conçoit bien s'énonce clairement, et les mots pour le dire vous viennent aisément. Nicolas Boileau
    Compiler Gcc sous windows avec MinGW
    Coder efficacement en C++ : dans les bacs le 17 février 2014
    mon tout nouveau blog

  4. #4
    Expert confirmé
    Homme Profil pro
    Étudiant
    Inscrit en
    Juin 2012
    Messages
    1 711
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Juin 2012
    Messages : 1 711
    Points : 4 442
    Points
    4 442
    Par défaut
    @dragonjoker59, la boucle d'affichage est totalement indépendante, ça ne devrais pas gêner.

    @koala01, c'est exactement ça, charger 4 images, travailler sur les 4, puis calculer un résultat à partir des 4. Ici les 4 sont les mêmes (ça mériterait effectivement un cas particulier ), mais ce n'est pas toujours le cas.
    Mais les calculs sont fait 4 fois qu'on affiche le résultat ou pas. Ce qui est bizarre c'est qu'en affichant le résultat le temps d'exec est multiplié par 3.

  5. #5
    Expert confirmé
    Homme Profil pro
    Étudiant
    Inscrit en
    Juin 2012
    Messages
    1 711
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Juin 2012
    Messages : 1 711
    Points : 4 442
    Points
    4 442
    Par défaut
    Citation Envoyé par dragonjoker59 Voir le message
    On va dire que tout dépend de ce que la boucle d'affichage fait.
    Peut être qu'avec celle-ci le compilo ne génère tout simplement pas de code AVX.
    Après vérification (diff du binaire généré) : aucune différence ici.
    A part des offsets différents, la seule différence est au niveau de la boucle d'affichage (présente d'un coté et non de l'autre).
    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
    Comparaison des fichiers NO_DISPLAY.TXT et WITH_DISPLAY.TXT
    ...
    ***** NO_DISPLAY.TXT
    main    PROC                                            
    $LN138:
            push    rbp
            lea     rbp, QWORD PTR [rsp-87]
            sub     rsp, 144                                
            mov     QWORD PTR $T31[rbp-57], -2
            mov     QWORD PTR [rsp+160], rbx
            mov     rax, QWORD PTR __security_cookie
    ***** WITH_DISPLAY.TXT
    main    PROC                                            
    $LN202:
            push    rbp
            lea     rbp, QWORD PTR [rsp-1040]
            sub     rsp, 1296                               
            mov     QWORD PTR $T36[rsp], -2
            mov     QWORD PTR [rsp+1312], rbx
            mov     rax, QWORD PTR __security_cookie
    *****
    ...

Discussions similaires

  1. limit et temps d'execution avec oracle et PHP
    Par dor_boucle dans le forum Oracle
    Réponses: 20
    Dernier message: 10/12/2005, 14h31
  2. Temps d'execution d'un select sur une vue
    Par rosewood dans le forum MS SQL Server
    Réponses: 2
    Dernier message: 21/02/2005, 16h06
  3. Temps d'execution d'une requête
    Par Maglight dans le forum Bases de données
    Réponses: 3
    Dernier message: 27/01/2005, 08h38
  4. [VB.NET] Temps d'éxécution d'une page...
    Par Webman dans le forum ASP.NET
    Réponses: 3
    Dernier message: 04/06/2004, 12h20
  5. Connaitre le temps d'execution d'un pgm ?
    Par yacinechaouche dans le forum C
    Réponses: 7
    Dernier message: 27/01/2003, 20h57

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