Forum Programmation.shell Mesurer le temps de copie d'un fichier à un autre avec time à l'aide d'un script

Posté par  . Licence CC By‑SA.
Étiquettes : aucune
0
15
mar.
2016

Bonjour,

Je cherche à mesurer le temps d'exécution de ce programme ci dessous en fonction de la taille du buffer N en faisant varier N entre 1 et 2 exp 20 en doublant la taille à chaque test.

   #include <unistd.h>

    #define N 1

    char c[N]; // le buffer pour les cars lus/à écrire

    int main(){
      int t;

      while((t = read(0, c, N)) > 0)
       write(1, c, t);
      return 0;
    }

Au lieu de procéder chaque fois à l'aide de
time a.out < entrée.txt > sortie.txt en modifiant à chaque tour N, il y aurait il une manière plus commode de le faire en une seul fois avec un script shell à exécuter pour qu'il m'affiche les résultats ?

Merci d'avance pour l'aide.

  • # programmation en C

    Posté par  . Évalué à 2. Dernière modification le 15 mars 2016 à 15:33.

    vu que ton programme ressemble fortement à du C,
    pourquoi ne pas utiliser les timers en C ?

    sinon tu peux utiliser les boucles en shell pour faire ta modification de N à chaque tout.
    ca ressemmblerait à :

    for VAR in 1 à N
    do
        time a.out $VAR < INPUT >OUTPUT
    done

    evidemment il faut que ton programme sache lire une variable fournie en ligne de commande (le $VAR)

    • [^] # Re: programmation en C

      Posté par  . Évalué à 1. Dernière modification le 15 mars 2016 à 17:10.

      Merci pour ta réponse.
      J'ai pensé à un script du genre:

              #! /bin/sh
      
              seq 0 20 | sed -e s/^/2^/ | bc |
              while read i ; do
                 gcc -DN=$i prog.c
                 time a.out < input.txt > out.txt
              done 2>&1 |
              grep user | sed 's/.*\(...\)s$/\1/'

      Mais j'arrive pas à saisir ou est le beug, quand je l'exécute il me renvoie le fichier out.txt vide au lieu du contenu de input.txt et les résultats de time sur la stdout sont tous à 0 pour toutes les possibilités du coup.
      J'ai omis quelque chose ?

      Merci de m'aider.

      • [^] # Re: programmation en C

        Posté par  . Évalué à 2.

        J'ai omis quelque chose ?

        essaie deja de faire plus simple

        for i in $(seq 0 20)
        do
           gcc -DN=$i
           time a.out <input.txt >out$i.txt | grep user | sed 's/.*\(...\)s$/\1/'
        done
        • [^] # Re: programmation en C

          Posté par  . Évalué à 1.

          Merci pour ton retour ;)

          J'ai testé ce script, ne manquerait il pas quelque chose ?
          La ligne 3 gcc -DN=$i apparemment le nom du programme manque.
          Je l'ai rajouté et exécuté.
          Il me crée 20 fichiers out.txt dont le contenu est vide et j'ai ces messages:
          ```
          prog.c:11:0: attention : « N » redéfini [enabled by default]
          :0:0: note: ceci est la localisation d'une précédente définition
          time: cannot run a.out: No such file or directory
          Command exited with non-zero status 127
          0.00user 0.00system 0:00.00elapsed ?%CPU (0avgtext+0avgdata 1392maxresident)k
          0inputs+0outputs (0major+74minor)pagefaults 0swaps
          ……

          ```Je vois pas ou ça beug cette fois.

          • [^] # Re: programmation en C

            Posté par  . Évalué à 2.

            en effet j'avais oublié le prog.c dans la boucle

            ce qui donne alors

            for i in $(seq 0 20)
            do
               gcc -DN=$i prog.c
               time a.out <input.txt >out$i.txt | grep user | sed 's/.*\(...\)s$/\1/'
            done

            ensuite l'erreur est normal si le gcc n'a rien fait il n'y a pas de a.out
            donc pas de programme a executer, donc un temps d'execution de "0"

            • [^] # Re: programmation en C

              Posté par  . Évalué à 1.

              Je n'ai pas bien saisi. Tu disais que le fait qu'il affiche ce message d'erreur comme résultat c'est parce que le fichier a.out n'existe pas (en effet j'avais complété prog.c avant de tester et le fichier a.out se crée bel et bien dans mon répertoire après l'exécution du script donc il est bien présent) ou c'est normal en général ?

              • [^] # Re: programmation en C

                Posté par  . Évalué à 2.

                donc si tu avais effectivement corrigé mon erreur, il doit avoir compilé et le fichier a.out doit exister
                s'il existe, il y a alors plusieurs possibilités

                a.out n'est pas executable
                s'il est executable, essaie time ./a.out <input.txt >output$i.txt
                car c'est peut-etre parce que a.out n'est pas dans le PATH

                • [^] # Re: programmation en C

                  Posté par  . Évalué à 1.

                  En effet j'avais omis "./" pour réussir à exécuter a.out.
                  A présent le script fonctionne :)
                  Par ailleurs, pour un fichier input.txt volumineux de l'ordre de 10 Go par exemple je constate que l'exécution du script a du mal à se terminer et prend énormément du temps pour la copie du fichier input dans le fichier output. J'ai laissé tourner le programme longtemps mais la copie était toujours en train de se faire, j'ai du forcer l'arret. Est ce normal ? si oui pourquoi cette lenteur ?

                  Merci d'avance.

                  • [^] # Re: programmation en C

                    Posté par  . Évalué à 2.

                    Est ce normal ? si oui pourquoi cette lenteur ?

                    ca faut demander au developpeur du programme :D
                    c'est lui qui a choisit un algoritme pour lire un fichier pour en copier le contenu dans un autre.

Suivre le flux des commentaires

Note : les commentaires appartiennent à celles et ceux qui les ont postés. Nous n’en sommes pas responsables.