1084 Stimmen

Wie messe ich gleichzeitig Anfrage- und Antwortzeiten mit cURL?

Ich habe einen Webdienst, der Daten im JSON-Format empfängt, die Daten verarbeitet und dann das Ergebnis an den Anfragenden zurückgibt.

Ich möchte die Anfrage-, Antwort- und Gesamtzeit mit cURL messen.

Meine Beispielanfrage sieht folgendermaßen aus:

curl -X POST -d @file server:port

und ich messe dies derzeit mit dem time-Befehl in Linux:

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

Der Zeitbefehl misst jedoch nur die gesamte Zeit, was jedoch nicht ganz das ist, wonach ich suche.

Gibt es einen Weg, um die Anfrage- und Antwortzeiten mit cURL zu messen?

2681voto

Simon East Punkte 50819

Von diesem brillanten Blog-Beitrag... https://blog.josephscott.org/2011/10/14/timing-details-with-curl/

cURL unterstützt formatierte Ausgabe für die Details der Anfrage (siehe die cURL-Befehlsreferenz für Details, unter -w, –write-out ). Für unsere Zwecke werden wir uns nur auf die bereitgestellten Zeitdetails konzentrieren. Die Zeiten unten sind in Sekunden.

  1. Erstellen Sie eine neue Datei, curl-format.txt, und fügen Sie ein:

         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. Führen Sie eine Anfrage aus:

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

    Oder auf Windows...

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

Was dies bewirkt:

-w "@curl-format.txt" sagt cURL, unsere Formatdatei zu verwenden
-o /dev/null leitet die Ausgabe der Anfrage auf /dev/null um
-s sagt cURL, keinen Fortschrittsbalken anzuzeigen
"http://wordpress.com/" ist die URL, die wir anfordern. Verwenden Sie Anführungszeichen, insbesondere wenn Ihre URL "&" Abfragezeichenfolgenparameter enthält

Und hier ist, was Sie zurückbekommen:

   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

Ich habe noch keine Option gesehen, um die Ergebnisse in Mikrosekunden auszugeben, aber wenn Sie eine kennen, posten Sie diese bitte in den Kommentaren unten.

Erstellen Sie eine Linux/Mac-Verknüpfung (Alias)

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

Dann können Sie einfach aufrufen...

curltime wordpress.org

Dank des Kommentators Pete Doyle!

Erstellen Sie ein eigenständiges Linux/Mac-Skript

Dieses Skript erfordert keine separate .txt Datei zur Formatierung.

Erstellen Sie eine neue Datei, curltime, irgendwo in Ihrem ausführbaren Pfad, und fügen Sie ein:

#!/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

Dann rufen Sie es auf die gleiche Weise wie das Alias auf:

curltime wordpress.org

Erstellen Sie eine Windows-Verknüpfung (auch BAT-Datei)

Erstellen Sie eine neue Textdatei namens curltime.bat im gleichen Ordner wie curl.exe und curl-format.txt, und fügen Sie die folgende Zeile ein:

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

Dann können Sie einfach von der Befehlszeile aus aufrufen:

curltime wordpress.org

(Stellen Sie sicher, dass der Ordner in Ihrer Windows-PATH-Variablen aufgeführt ist, um den Befehl aus jedem Ordner verwenden zu können.)

372voto

Tho Punkte 19990

Option 1: um die Gesamtzeit zu messen:

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

Beispiel Ausgabe:

Gesamtzeit: 0.441094s

Option 2: um die Verbindungsdauer, die Zeit bis zum ersten Byte (TTFB) und die Gesamtzeit zu erhalten:

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

Beispiel Ausgabe:

Verbindung aufbauen: 0.020033s
TTFB: 0.417907s
Gesamtzeit: 0.435486s

Ref: Response-Zeit mit curl erhalten

266voto

sdasdadas Punkte 22289

Hier ist die Antwort:

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

Alle verwendeten Variablen mit -w können in man curl gefunden werden.

93voto

Konstantin Punkte 2555

Das folgende ist von Simons Antwort inspiriert. Es ist eigenständig (erfordert keine separate Formatdatei), was es großartig für die Einbindung in die .bashrc macht.

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" "$@"
}

Darüber hinaus sollte es mit allen Argumenten funktionieren, die curl normalerweise akzeptiert, da "$@" sie einfach durchreicht. Zum Beispiel können Sie Folgendes tun:

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

Ausgabe:

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

60voto

mahemoff Punkte 41244

Ein Shortcut, den Sie Ihrer .bashrc etc. hinzufügen können, basierend auf anderen Antworten hier:

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

Verwendung:

> perf stackoverflow.com
0.521 + 0.686 = 1.290

CodeJaeger.com

CodeJaeger ist eine Gemeinschaft für Programmierer, die täglich Hilfe erhalten..
Wir haben viele Inhalte, und Sie können auch Ihre eigenen Fragen stellen oder die Fragen anderer Leute lösen.

Powered by:

X