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

Shell et commandes GNU Discussion :

Script de récupération des temps d'exécution


Sujet :

Shell et commandes GNU

  1. #1
    Futur Membre du Club
    Homme Profil pro
    Étudiant
    Inscrit en
    Avril 2013
    Messages
    7
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Hauts de Seine (Île de France)

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

    Informations forums :
    Inscription : Avril 2013
    Messages : 7
    Points : 8
    Points
    8
    Par défaut Script de récupération des temps d'exécution
    Bonjour, mon objectif est d'afficher une courbe (gnuplot) dépendant du temps d'exécution d'un programme C en fonction de la taille des opérandes sur lequel celui-ci se fait. Plus précisément, ici, il s'agit d'étudier la complexité d'un algorithme dérivé de la méthode de Strassen pour la multiplication de matrices.

    Pour ce faire, j'ai fait un script ayant but de lister les temps d'exécution (accompagnés de la taille de la matrice, ici servant d'abscisse)dans un fichier afin de pouvoir les exploiter par gnuplot.

    Voici mon script:
    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
     
    #! /bin/bash
    # etalonner.sh
    # Ce script nécessite: Strassen.c et strassen.sh
    # But de ce script:récupérer chaque temps de calcul effectué par la la multiplication de deux matrices par la méthode de Strassen en fonctio de la taille de ces matrices.
    # Envoyer ces temps pour un traitement d'interpolation afin d'obtenir une courbe propre.
    i=2;
    `touch interp.txt`
    while [[ $i -lt 32768 ]] # Jusqu'à 2^15 après c'est un débordement de l'expression (prise de la totalité de la ram (8go)).
    do
     `gcc -o Strassen -D'N='$i'' Strassen.c` || echo "Erreur, nous n'avons pas les documents nécessaires."
      echo n=$i
      echo `time ./strassen.sh`
      echo -------------------
     i=$(( $i + 1 ))
    done

    Comme vous le voyez, je passe par un script intermédiaire car `time ./Strassen` ne marche pas.
    Dans strassen.sh:
    J'obtiens une sortie de ce type:
    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
     
    n=2
     
    real	0m0.004s
    user	0m0.000s
    sys	0m0.000s
     
    -------------------
    n=3
     
    real	0m0.009s
    user	0m0.000s
    sys	0m0.000s
     
    -------------------
    ...etc...

    Je cherche à récupérer le temps en seconde de chaque première ligne c'est à dire obtenir ceci dans un fichier:
    0.002 0.004
    0.003 0.009
    ...etc...
    Mon problème est que je n'arrive pas à appliquer quoi que ce soit à la sortie:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    echo `time ./strassen.sh`
    J'ai essayé en apliquant (|) :

    head -n 1

    ou bien

    grep real

    Ça ne fait déjà rien du tout. Idéalement je voudrais appliquer un sed.

    C'est la première fois que je fais ce genre d'étalonnage en dehors de Maple, pouvez-vous me conseiller sur la méthode optimale pour un test de complexité de ce genre si ma méthode se trouve être idiote ? Et pouvez-vous m'expliquer comment je peux exploiter la commande time ?

    Merci d'avance.

  2. #2
    Modérateur
    Avatar de N_BaH
    Profil pro
    Inscrit en
    Février 2008
    Messages
    7 591
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Février 2008
    Messages : 7 591
    Points : 19 469
    Points
    19 469
    Par défaut
    Bonjour,

    pourquoi exécuter gcc dans un sous interpréteur (entre `) ?

    `time ./Strassen` ne marche pas
    c'est à dire ?
    pourquoi dans un sous-shell ?
    pourquoi ajouter echo ?


    time envoie sa sortie sur la sortie d'erreur (stderr), et est paramétrable par la variable d'environnement TIMEFORMAT.


    tu pourrais aussi soustraire la date depuis Epoch avant et après l'exécution du programme
    ...
    ?

  3. #3
    Futur Membre du Club
    Homme Profil pro
    Étudiant
    Inscrit en
    Avril 2013
    Messages
    7
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Hauts de Seine (Île de France)

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

    Informations forums :
    Inscription : Avril 2013
    Messages : 7
    Points : 8
    Points
    8
    Par défaut
    pourquoi exécuter gcc dans un sous interpréteur (entre `) ?
    J'ai besoin de recompiler à chaque itération car N est défini à la précompilation. Ce n'est peut-être pas la méthode optimale, mais je pense que c'est nécessaire pour compter le temps d'exécution à l'aide des commandes shell.

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    echo `time ./strassen.sh`
    et
    `time ./strassen.sh`
    me donnent la même sortie que j'ai copié en dessous. J'ai ajouté echo car j'ai fait plusieurs essais pour appliquer head. Je ne suis pas très expérimenté dans les commandes du shell.

  4. #4
    Modérateur
    Avatar de N_BaH
    Profil pro
    Inscrit en
    Février 2008
    Messages
    7 591
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Février 2008
    Messages : 7 591
    Points : 19 469
    Points
    19 469
    Par défaut
    la question n'est pas que tu compiles le programme lors de chaque boucle, mais que tu le fasses dans un sous-interpréteur, cela crée une nouvelle instance du shell inutile.

    et tu ne réponds pas à ma question, pourquoi "ça marche pas" l'exécution de ./strassen ?

  5. #5
    Expert éminent sénior Avatar de Flodelarab
    Homme Profil pro
    Inscrit en
    Septembre 2005
    Messages
    5 271
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Charente (Poitou Charente)

    Informations forums :
    Inscription : Septembre 2005
    Messages : 5 271
    Points : 13 536
    Points
    13 536
    Par défaut
    Salut,

    En ce qui concerne sed, je fais un truc du genre:

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    sed '/^real/{N;N;s/real//;s/\nuser//;s/\nsys//;H};$!d;$g;s/^\n//' initial.txt
    Et j'obtiens ceci à partir de la sortie donnée dans le premier post.

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
        0m0.004s     0m0.000s      0m0.000s   
        0m0.009s     0m0.000s      0m0.000s
    Je ne sais pas s'il faut changer les minutes en secondes. Sed ne fait pas d'arithmétique.
    Je ne sais pas non plus si les "n=2" et "n=3" étaient à garder.

  6. #6
    Futur Membre du Club
    Homme Profil pro
    Étudiant
    Inscrit en
    Avril 2013
    Messages
    7
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Hauts de Seine (Île de France)

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

    Informations forums :
    Inscription : Avril 2013
    Messages : 7
    Points : 8
    Points
    8
    Par défaut
    à N_BaH:

    En effet, je n'avais pas remarqué:
    marche. C'est parce que j'ai essayé autre chose à côté en même temps et j'ai cru que le problème venait de ./Strassen. Merci .


    à Flodelarab:
    Merci de ton aide, ton expression de sed a l'air compliquée, je pense qu'on peut faire plus simple:
    Il s'agit de sélectioner la ligne qui commence par «real» puis de ne garder que «0.004» de la première ligne.
    J'ai essayé ton sed et, pareil, aucun effet, je sais pas d'où ça vient.

    Je ne sais pas non plus si les "n=2" et "n=3" étaient à garder.
    Oui, ils sont à écrire dans le même fichier pour les abscisses sous cette forme «0.002» et «0.003»

  7. #7
    Modérateur
    Avatar de N_BaH
    Profil pro
    Inscrit en
    Février 2008
    Messages
    7 591
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Février 2008
    Messages : 7 591
    Points : 19 469
    Points
    19 469
    Par défaut

    mais pourquoi dans un sous-interpréteur (substitution de commandes) ? pourquoi ?

  8. #8
    Futur Membre du Club
    Homme Profil pro
    Étudiant
    Inscrit en
    Avril 2013
    Messages
    7
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Hauts de Seine (Île de France)

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

    Informations forums :
    Inscription : Avril 2013
    Messages : 7
    Points : 8
    Points
    8
    Par défaut
    Ah, ça marche sans les apostrophes ! Et c'est donc ça que t'appeles sous-shell ?
    J'avoue que c'est laborieux, mais étant donné que je ne suis pas à l'aise en shell, j'ai pris des sortes de précaution: apostrophes, echo et sous-script .

  9. #9
    Expert éminent sénior Avatar de Flodelarab
    Homme Profil pro
    Inscrit en
    Septembre 2005
    Messages
    5 271
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Charente (Poitou Charente)

    Informations forums :
    Inscription : Septembre 2005
    Messages : 5 271
    Points : 13 536
    Points
    13 536
    Par défaut
    sed ne fait pas d'arithmétique. J'utilise sed pour nettoyer la sortie et awk pour transformer 2378 en 2.378 et les minutes en secondes.

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    sed -n '/n=/{N;N;s/^n=//;s/\n[^\n]*\nreal//;s/m/ /;s/s//;H};${g;s/^\n//;p}' initial.txt |awk '{print $1/1000,$2*60+$3}'
    Et le résultat:

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    0.002 0.004
    0.003 0.009
    Bien sûr, tu n'as pas de 'initial.txt' mais tu l'enlèves au profit d'un pipe.

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    ./monscript |sed '....' |awk '....'

  10. #10
    Futur Membre du Club
    Homme Profil pro
    Étudiant
    Inscrit en
    Avril 2013
    Messages
    7
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Hauts de Seine (Île de France)

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

    Informations forums :
    Inscription : Avril 2013
    Messages : 7
    Points : 8
    Points
    8
    Par défaut
    Voici le script actuel avec votre aide:

    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
    #! /bin/bash
    # etalonner.sh
    # Ce script nécessite: Strassen.c et strassen.sh
    # But de ce script:récupérer chaque temps de calcul effectué par la la multiplication de deux matrices par la méthode de Strassen en fonctio de la taille de ces matrices.
    # Envoyer ces temps pour un traitement d'interpolation afin d'obtenir une courbe propre.
    i=2;
    if [[ -f interp.txt ]]
    then
        rm -f interp.txt
    fi
    touch interp.txt
    while [[ $i -lt 32768 ]] # Jusqu'à 2^15 après c'est un débordement de l'expression (prise de la totalité de la ram (8go)).
    do
     `gcc -o Strassen -D'N='$i'' Strassen.c` || echo "Erreur, nous n'avons pas les documents nécessaires."
      echo n=$i
      echo `time ./Strassen` | sed -n '/n=/{N;N;s/^n=//;s/\n[^\n]*\nreal//;s/m/ /;s/s//;H};${g;s/^\n//;p}'|  awk '{print $1/1000,$2*60+$3}' >> interp.txt
      echo -------------------
     i=$(( $i + 1 ))
    done
    Ça donne dans le fichier interp.txt:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
     
    0 0
    0 0
    0 0
    0 0
    0 0
    0 0
    0 0
    0 0
    0 0
    0 0
    ..etc..

    Peut-être qu'il y a une troncature quelque part, les premiers temps sont très petits:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
     
    n=2
     
    real	0m0.001s
    user	0m0.000s
    sys	0m0.000s
    -------------------
    n=3
     
    real	0m0.002s
    user	0m0.000s
    sys	0m0.000s
    -------------------
    ...etc

    Si ce n'est qu'une histoire d'arrondi, on n'est pas loin de la solution.

  11. #11
    Expert éminent sénior Avatar de disedorgue
    Homme Profil pro
    Ingénieur intégration
    Inscrit en
    Décembre 2012
    Messages
    4 310
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Ingénieur intégration
    Secteur : High Tech - Opérateur de télécommunications

    Informations forums :
    Inscription : Décembre 2012
    Messages : 4 310
    Points : 12 818
    Points
    12 818
    Par défaut
    Bonjour,
    essaie en modifiant (pas testé):
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
     echo n=$i
      echo `time ./Strassen` | sed -n '/n=/{N;N;s/^n=//;s/\n[^\n]*\nreal//;s/m/ /;s/s//;H};${g;s/^\n//;p}'|  awk '{print $1/1000,$2*60+$3}' >> interp.txt
    par:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
     (echo n=$i ; (time ./Strassen) 2>&1) | sed -n '/n=/{N;N;s/^n=//;s/\n[^\n]*\nreal//;s/m/ /;s/s//;H};${g;s/^\n//;p}'|  awk '{print $1/1000,$2*60+$3}' >> interp.txt
    Cordialement.

  12. #12
    Expert éminent sénior Avatar de Flodelarab
    Homme Profil pro
    Inscrit en
    Septembre 2005
    Messages
    5 271
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Charente (Poitou Charente)

    Informations forums :
    Inscription : Septembre 2005
    Messages : 5 271
    Points : 13 536
    Points
    13 536
    Par défaut
    • +1 disedorgue. J'allais le proposer
    • pour la commande time, selon ton environnement, tu peux utiliser time -f "%E" (qui ne marche pas avec bash) ou affecter TIMEFORMAT=%E (qui marche avec bash). Dans ce cas là, ta commande time est directe. Plus besoin de sed.

  13. #13
    Modérateur
    Avatar de N_BaH
    Profil pro
    Inscrit en
    Février 2008
    Messages
    7 591
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Février 2008
    Messages : 7 591
    Points : 19 469
    Points
    19 469
    Par défaut
    Et c'est donc ça que t'appeles sous-shell ?
    mouais, ±
    c'est une substitution de commandes qui s'exécute dans un sous-interpréteur.

  14. #14
    Expert éminent sénior Avatar de disedorgue
    Homme Profil pro
    Ingénieur intégration
    Inscrit en
    Décembre 2012
    Messages
    4 310
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Ingénieur intégration
    Secteur : High Tech - Opérateur de télécommunications

    Informations forums :
    Inscription : Décembre 2012
    Messages : 4 310
    Points : 12 818
    Points
    12 818
    Par défaut
    Citation Envoyé par Flodelarab Voir le message
    • +1 disedorgue. J'allais le proposer
    • pour la commande time, selon ton environnement, tu peux utiliser time -f "%E" (qui ne marche pas avec bash) ou affecter TIMEFORMAT=%E (qui marche avec bash). Dans ce cas là, ta commande time est directe. Plus besoin de sed.
    Bof, ce que j'ai proposé c'est juste pour résoudre son problème ponctuel mais la façon de géré à la volée des données qui viennent de la sortie d'erreur et qui ne sont pas des erreurs, c'est aller droit dans le mur.
    Dans le cas présent, si son prog sort en erreur , cela passera inaperçu.

    Cordialement.

  15. #15
    Futur Membre du Club
    Homme Profil pro
    Étudiant
    Inscrit en
    Avril 2013
    Messages
    7
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Hauts de Seine (Île de France)

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

    Informations forums :
    Inscription : Avril 2013
    Messages : 7
    Points : 8
    Points
    8
    Par défaut
    Avec la modification de disedorgue, ça marche ! Merci

    Le fichier contient après exécution:
    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
    0.002 0.002
    0.003 0.002
    0.004 0.003
    0.005 0.002
    0.006 0.001
    0.007 0.002
    0.008 0.003
    0.009 0.002
    0.01 0.002
    0.011 0.004
    0.012 0.003
    0.013 0.001
    0.014 0.002
    0.015 0.002
    0.016 0.002
    0.017 0.003
    0.018 0.002
    0.019 0.003
    0.02 0.002
    0.021 0.001
    0.022 0.001
    0.023 0.001
    0.024 0.001
    0.025 0.004
    0.026 0.004
    0.027 0.003
    0.028 0.002
    0.029 0.003
    0.03 0.002
    Vous m'avez tous très bien aidé, je vous en remercie.

    En vérité, je n'ai pas rempli la totalité de mon objectif, puisque j'aimerais appliquer ces temps à une interpolation polynomiale afin d'avoir une courbe bien propre. Cela est prévu grâce à un programme C artisanal, pas prévu pour récupérer des données dans un fichier.
    Je ne veux pas pousser, et cela concerne le C et non le shell. Je posterai sans doute un sujet dans la rubrique du C si je ne trouve pas les outils dont j'ai besoin: essentiellement un moyen de mettre les données ci-dessus dans deux tableaux de «double».
    Encore une fois, je sais, c'est laborieux, mais c'est la première fois que j'élabore ce type d'outil.

  16. #16
    Expert éminent sénior Avatar de disedorgue
    Homme Profil pro
    Ingénieur intégration
    Inscrit en
    Décembre 2012
    Messages
    4 310
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Ingénieur intégration
    Secteur : High Tech - Opérateur de télécommunications

    Informations forums :
    Inscription : Décembre 2012
    Messages : 4 310
    Points : 12 818
    Points
    12 818
    Par défaut
    Juste pour info, je n'ai fait que tenir compte de la remarque de N_BaH au sujet de time. Et agencer ce que Flodelarab t'avais déjà donné pour le formatage

    Cordialement.

  17. #17
    Futur Membre du Club
    Homme Profil pro
    Étudiant
    Inscrit en
    Avril 2013
    Messages
    7
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Hauts de Seine (Île de France)

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

    Informations forums :
    Inscription : Avril 2013
    Messages : 7
    Points : 8
    Points
    8
    Par défaut
    Oui, je remerciais tout le monde, disedorge.
    Et je semble avoir trouvé mon outil: fscanf tout simplement, cette fonction m'était sorti de l'esprit, je pensais à fgets.
    Bonne soirée.

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

Discussions similaires

  1. Réponses: 1
    Dernier message: 26/06/2012, 14h54
  2. Récupération des paramètres d'exécutions
    Par AcidLines dans le forum VB.NET
    Réponses: 7
    Dernier message: 17/11/2010, 10h13
  3. VBA Comparer des temps d'exécutions très courts
    Par pgz dans le forum Contribuez
    Réponses: 5
    Dernier message: 10/12/2008, 13h28
  4. Réponses: 23
    Dernier message: 25/11/2008, 10h38
  5. script pour ajouter des droits d'exécution aux scripts
    Par Chatbour dans le forum Shell et commandes GNU
    Réponses: 4
    Dernier message: 14/10/2007, 17h40

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