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

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    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
    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 651
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Février 2008
    Messages : 7 651
    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
    ...
    ?
    N'oubliez pas de consulter les cours shell, la FAQ, et les pages man.

  3. #3
    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
    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 651
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Février 2008
    Messages : 7 651
    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 ?
    N'oubliez pas de consulter les cours shell, la FAQ, et les pages man.

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

    Informations forums :
    Inscription : Septembre 2005
    Messages : 5 287
    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
    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
    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»

+ 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