From 803de74c0f19cb47b59032f54797b3d4088d8bf2 Mon Sep 17 00:00:00 2001 From: Jay Caines-Gooby Date: Thu, 11 Apr 2019 23:24:32 +0100 Subject: [PATCH] Don't loop the gif --- demo.gif | Bin 22940 -> 23098 bytes ttfb | 200 ------------------------------------------------------- 2 files changed, 200 deletions(-) delete mode 100755 ttfb diff --git a/demo.gif b/demo.gif index deff230885cfa36f192f531c58407eb868cbbb38..de29d19b2824685c9b015cd7a55eb98635cb7a0a 100644 GIT binary patch delta 10369 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 Lc*lB!IPyOL^f?;q diff --git a/ttfb b/ttfb deleted file mode 100755 index 0f9e49c..0000000 --- a/ttfb +++ /dev/null @@ -1,200 +0,0 @@ -#!/bin/bash -# -# Shows time in seconds to first byte of a url or urls -# -# Based on a gist https://gist.github.com/sandeepraju/1f5fbdbdd89551ba7925abe2645f92b5 -# by https://github.com/sandeepraju -# -# Modified by jay@gooby.org, @jaygooby -# -# Usage: ttfb [options] url [url...] -# -d debug -# -l (infers -d) log response headers. Defaults to ./curl.log -# -n of times to test time to first byte -# -v verbose output. Show request breakdown during -n calls -# -# Examples: -# -# ttfb https://example.com/example/url -# .098974 -# -# ttfb -n 5 https://example.com/ -# ..... -# fastest .099195 slowest .103138 median .099684 -# -# ttfb -n 5 bbc.co.uk news.bbc.co.uk -# ..... -# ..... -# bbc.co.uk fastest .045873 slowest .046870 median .045999 -# news.bbc.co.uk fastest .042286 slowest .060245 median .046035 -# -# ttfb bbc.co.uk news.bbc.co.uk -# bbc.co.uk .048378 -# news.bbc.co.uk .049303 -# -# Implicitly follows redirects using curl's -L option. -# -# Log all response headers (default log file is ./curl.log) by calling with -d -# -# Override the default log file by specifying -l /some/file -# -# Get min, max and median values by specifying the number of times to call -# the URL; use -n2 for 2 tests, -n5 for 5 and so on. -# -# If you specify more than one url and have specified -d or -l, the log file -# will be prefixed with the URL being requested. -# -# If you specify -n and -d or -l, the response headers from the consecutive -# requests will be concatenated in the log file. -# -# See https://blog.cloudflare.com/a-question-of-timing/ -# and https://curl.haxx.se/docs/manpage.html for an explanation -# of how the curl variables relate to the various stages of -# the transfer. -# -# To get a better approximation of devtool's TTFB, consider -# the time without the connection overhead: -# %{time_starttransfer} - %{time_appconnect} -# -# Uses a dirty eval to do the ttfb arithmetic. Depends -# on bc and column commands. -set -eu - -# check dependencies -for dependency in curl bc column; do - which -s $dependency || (echo "You need to have '$dependency' installed and in your \$PATH" >&2 && exit 1) -done - -# Cribbed from https://stackoverflow.com/a/41762669/391826 -median() { - arr=($(printf '%s\n' "${@}" | sort -n)) - nel=${#arr[@]} - if (( $nel % 2 == 1 )); then # Odd number of elements - val="${arr[ $(($nel/2)) ]}" - else # Even number of elements - (( j=nel/2 )) - (( k=j-1 )) - val=$(echo "scale=6;(${arr[j]}" + "${arr[k]})"/2|bc -l) - fi - echo $val -} - -# defaults -DEBUG="" -LOG="" -NUM_REQUESTS=0 -VERBOSE=0 - -while getopts ":n:dl:v" OPTION -do - case $OPTION in - d) DEBUG=1 ;; - l) LOG="$OPTARG" ;; - n) NUM_REQUESTS=$OPTARG ;; - v) VERBOSE=1 ;; - \?) echo -e "Usage: ttfb [options] url [url...]\n\t-d debug\n\t-l (infers -d) log response headers. Defaults to ./curl.log\n\t-n of times to test time to first byte\n\t-v verbose output. Show response breakdown (DNS lookup, TLS handshake etc)" >&2 - exit 1 - ;; - esac -done - -shift $((OPTIND - 1)) # shifts away every option argument, - # leaving urls as $@ - -if [ -z "$1" ]; then - echo "You didn't specify any urls to fetch" - exit 1 -else - URLS="$@" -fi - -# if we're given a custom log file, or log directory, implicitly set DEBUG=1 -[ -n "$LOG" ] && DEBUG=1 - -# default the log file to curl.log in pwd or LOG_DIRECTORY if -o was specified -LOG="${LOG:-curl.log}" - -# now work out if $LOG is relative or an absolute path -# and then get the dirname -[ "$LOG" != "${LOG#/}" ] && LOG_DIRECTORY=$(dirname "$LOG") || LOG_DIRECTORY=$(dirname "${PWD}/$LOG") -if [ ! -d "$LOG_DIRECTORY" ]; then - echo "Log directory $LOG_DIRECTORY doesn't exist" >&2 - exit 1; -fi - -# then set the actual log filename -LOG=$(basename "$LOG") - -DEBUG=${DEBUG:-0} - -options=() -options+=(-o /dev/null) -options+=(-s) -options+=(-L) -options+=(--http2) -options+=(-H 'Cache-Control: no-cache') -options+=(-w 'echo DNS lookup: %{time_namelookup} TLS handshake: %{time_appconnect} TTFB including connection: %{time_starttransfer} TTFB: $(echo %{time_starttransfer} - %{time_appconnect} | bc) Total time: %{time_total} \n') -if [ $DEBUG -eq 1 ]; then - options+=(-D "${LOG_DIRECTORY}/${LOG}") -fi - -for URL in $URLS; do - - # if we're checking more than one url - # output the url on the results line - if [ ${#@} -gt 1 ]; then - SHOW_URL="${URL}|" - if [[ $VERBOSE -eq 1 && -n "$NUM_REQUESTS" && "$NUM_REQUESTS" -gt 1 ]]; then - echo $URL >&2 - fi - else - SHOW_URL="" - fi - - # if multiple requests have been specified, then show min, max & median values - if [[ -n "$NUM_REQUESTS" && "$NUM_REQUESTS" -gt 1 ]]; then - ttfbs=() - for i in $(seq $NUM_REQUESTS); do - - # if we're checking more than one url, and debug is set, then log - # the headers to a per-url file, but also for each request - if [[ ${#@} -gt 1 && $DEBUG -eq 1 ]]; then - LOGFILE="${URL//[^[:alnum:]]/_}" - options+=(-D "${LOG_DIRECTORY}/${LOGFILE}-${LOG}_${i}") - elif [ $DEBUG -eq 1 ]; then - # we only have the one URL, but we still are requesting multiple - # ttfb calls, so log the headers - options+=(-D "${LOG_DIRECTORY}/${LOG}_${i}") - fi - - request=$(eval $(curl "${options[@]}" "$URL")) - ttfbs+=($(echo $request | grep -oE "TTFB: .{0,7}" | cut -d' ' -f2 | sort -n)); - if [ $VERBOSE -eq 1 ]; then - echo "$request" >&2 - else - printf "." >&2 - fi - done - - # tidy up - combine multiple request logs for the same url into a single file - if [[ ${#@} -gt 1 && $DEBUG -eq 1 ]]; then - cat "${LOG_DIRECTORY}/${LOGFILE}-${LOG}_"* > "${LOG_DIRECTORY}/${LOGFILE}-${LOG}" - rm "${LOG_DIRECTORY}/${LOGFILE}-${LOG}_"* - elif [ $DEBUG -eq 1 ]; then - cat "${LOG_DIRECTORY}/${LOG}_"* > "${LOG_DIRECTORY}/${LOG}" - rm "${LOG_DIRECTORY}/${LOG}_"* - fi - - printf "\n" >&2 - # sort the times - ttfbs=( $( printf "%s\n" "${ttfbs[@]}" | sort -n ) ) - # show quickest, slowest and median fftb - printf "${SHOW_URL}\e[32mfastest \e[39m${ttfbs[0]} \e[91mslowest \e[39m${ttfbs[${#ttfbs[*]}-1]} \e[95mmedian \e[39m$(median ${ttfbs[*]})\e[39m\n"; - else - if [ $VERBOSE -eq 1 ]; then - echo -e $SHOW_URL $(eval $(curl "${options[@]}" "$URL")) - else - echo -e $SHOW_URL $(eval $(curl "${options[@]}" "$URL") | grep -oE "TTFB: .{0,7}" | cut -d' ' -f2) - fi - fi -done | column -s'|' -t