788 votes

Comment mesurer les temps de demande et de réponse en une seule fois en utilisant cURL ?

J'ai un service Web qui reçoit des données au format JSON, les traite et renvoie le résultat au demandeur.

Je veux mesurer la demande, la réponse, et le temps total en utilisant cURL .

Mon exemple de demande ressemble à ceci :

curl -X POST -d @file server:port

et je le mesure actuellement en utilisant le time sous Linux :

time curl -X POST -d @file server:port

La commande de temps ne mesure que total temps, cependant - ce qui n'est pas tout à fait ce que je recherche.

Existe-t-il un moyen de mesurer les temps de demande et de réponse à l'aide de l'outil cURL ?

2004voto

Simon Points 4467

De ce brillant article de blog... https://blog.josephscott.org/2011/10/14/timing-details-with-curl/

cURL prend en charge la sortie formatée pour les détails de la requête (cf. la page de manuel cURL pour plus de détails , sous -w, –write-out <format> ). Pour nos besoins, nous nous concentrerons uniquement sur les détails du timing qui sont fournis. Les heures ci-dessous sont en secondes .

  1. Créez un nouveau fichier, curl-format.txt, et collez-le :

         time_namelookup:  %{time_namelookup}s\n
            time_connect:  %{time_connect}s\n
         time_appconnect:  %{time_appconnect}s\n
        time_pretransfer:  %{time_pretransfer}s\n
           time_redirect:  %{time_redirect}s\n
      time_starttransfer:  %{time_starttransfer}s\n
                         ----------\n
              time_total:  %{time_total}s\n
  2. Faites une demande :

     curl -w "@curl-format.txt" -o /dev/null -s "http://wordpress.com/"

Ou sur Windows, c'est...

    curl -w "@curl-format.txt" -o NUL -s "http://wordpress.com/"

Ce que ça fait :

-w "@curl-format.txt" indique à cURL d'utiliser notre fichier de format
-o /dev/null redirige la sortie de la requête vers /dev/null
-s indique à cURL de ne pas afficher un compteur de progression
"http://wordpress.com/" est l'URL que nous demandons. Utilisez des guillemets en particulier si votre URL comporte des paramètres de chaîne de requête "&".

Et voici ce que vous obtenez en retour :

   time_namelookup:  0.001s
      time_connect:  0.037s
   time_appconnect:  0.000s
  time_pretransfer:  0.037s
     time_redirect:  0.000s
time_starttransfer:  0.092s
                   ----------
        time_total:  0.164s

Créer un raccourci Linux/Mac (alias)

alias curltime="curl -w \"@$HOME/.curl-format.txt\" -o /dev/null -s "

Alors vous pouvez simplement appeler...

curltime wordpress.org

Merci au commentateur Pete Doyle !

Faire un script autonome pour Linux/Mac

Ce script ne nécessite pas de fichier .txt distinct pour contenir le formatage.

Créez un nouveau fichier, curltime, quelque part dans votre chemin d'exécution, et collez-le :

#!/bin/bash

curl -w @- -o /dev/null -s "$@" <<'EOF'
    time_namelookup:  %{time_namelookup}\n
       time_connect:  %{time_connect}\n
    time_appconnect:  %{time_appconnect}\n
   time_pretransfer:  %{time_pretransfer}\n
      time_redirect:  %{time_redirect}\n
 time_starttransfer:  %{time_starttransfer}\n
                    ----------\n
         time_total:  %{time_total}\n
EOF

Appeler de la même manière que l'alias :

curltime wordpress.org

Créer un raccourci Windows (alias fichier BAT)

Mettez cette commande dans CURLTIME.BAT (dans le même dossier que curl.exe)

curl -w "@%~dp0curl-format.txt" -o NUL -s %*

Alors vous pouvez simplement appeler...

curltime wordpress.org

31 votes

Réponse géniale. merci. une chose que j'ai dû faire était d'ajouter \n pour couper la ligne dans le fichier texte

2 votes

Dans le fichier BAT de Windows, il n'envoie que le premier paramètre, modifiez-le pour transmettre tous les paramètres et désactiver l'écho de la commande elle-même : @curl -w "@%~dp0curl-format.txt" -o NUL -s %* Excellente réponse

0 votes

Merci @udoh, j'ai mis à jour la réponse pour inclure cela.

196voto

sdasdadas Points 4878

Voici la réponse :

curl -X POST -d @file server:port -w %{time_connect}:%{time_starttransfer}:%{time_total}

Toutes les variables utilisées avec -w peuvent être trouvés dans man curl .

26 votes

Il est préférable pour l'expérience utilisateur d'ajouter de nouvelles lignes : "\n%{time_connect}:%{time_starttransfer}:%{time_total}\n"

1 votes

Pour moi, cela ne fonctionnait pas sans guillemets. Je suggère d'ajouter des guillemets en spécifiant le format /h/a/c/haproxy # curl -w "%{time_total} \n " google.com -o /dev/null -s 0.055

0 votes

@Geek Il est généralement judicieux d'afficher les erreurs lors du fonctionnement en mode silencieux ( -sS ).

179voto

ThoQ Luong Points 416

Option 1. Pour mesurer total time :

curl -o /dev/null -s -w 'Total: %{time_total}s\n'  https://www.google.com

Exemple de sortie :

enter image description here

Option 2. Pour obtenir time to establish connection , time to first byte (TTFB) et total time :

curl -o /dev/null -s -w 'Establish Connection: %{time_connect}s\nTTFB: %{time_starttransfer}s\nTotal: %{time_total}s\n'  https://www.google.com

Exemple de sortie :

enter image description here

Réf : Obtenir le temps de réponse avec curl

55voto

mahemoff Points 4879

Un raccourci que vous pouvez ajouter à votre .bashrc etc, basé sur d'autres réponses ici :

function perf {
  curl -o /dev/null -s -w "%{time_connect} + %{time_starttransfer} = %{time_total}\n" "$1"
}

Utilisation :

> perf stackoverflow.com
0.521 + 0.686 = 1.290

6 votes

J'utilise une variante qui affiche le nombre d'octets téléchargés pendant le temps mesuré : curl -o /dev/null -s -w "time_total: %{time_total} sec\nsize_download: %{size_download} bytes\n" https://www.google.com

52voto

Konstantin Đ. Points 188

Ce qui suit est inspiré de la réponse de Simon. Il est autonome (il ne nécessite pas de fichier de format séparé), ce qui le rend idéal pour être inclus dans le fichier .bashrc .

curl_time() {
    curl -so /dev/null -w "\
   namelookup:  %{time_namelookup}s\n\
      connect:  %{time_connect}s\n\
   appconnect:  %{time_appconnect}s\n\
  pretransfer:  %{time_pretransfer}s\n\
     redirect:  %{time_redirect}s\n\
starttransfer:  %{time_starttransfer}s\n\
-------------------------\n\
        total:  %{time_total}s\n" "$@"
}

En outre, il devrait fonctionner avec tous les arguments qui curl prend normalement, puisque le "$@" les fait simplement passer. Par exemple, vous pouvez le faire :

curl_time -X POST -H "Content-Type: application/json" -d '{"key": "val"}' https://postman-echo.com/post

Sortie :

   namelookup:  0,125000s
      connect:  0,250000s
   appconnect:  0,609000s
  pretransfer:  0,609000s
     redirect:  0,000000s
starttransfer:  0,719000s
-------------------------
        total:  0,719000s

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X