summaryrefslogtreecommitdiffstats
path: root/test-performance.sh
blob: 27e59d2c1166ca4ad506dc1f9ee2a153062d979c (plain) (blame)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
scriptDir="$(cd "$(dirname "$0")"; pwd)"

source "$scriptDir/radar-base.sh"

cd_to_tmp() {
  tmpfile="/tmp/git-prompt-tests-$(time_now)$1"
  mkdir -p "$tmpfile"
  cd "$tmpfile"
}

rm_tmp() {
  cd $scriptDir
  rm -rf /tmp/git-prompt-tests*
}

report() {
  arr=( "$@" )
  printf '%s\n' "${arr[@]}" | sort -n | awk '
  function colored(s) {
    OFMT="%2.3fs";
    OFS="";
    ORS="";
    if( s > 0.2 ) {
      print "\033[1;31m", s, "\033[0m"
    } else if( s > 0.1 ) {
      print "\033[1;33m", s, "\033[0m"
    } else {
      print "\033[1;32m", s, "\033[0m"
    }
    OFS="\t";
    ORS="\n";
  }
  BEGIN {
    c = 0;
    sum = 0;
  }
  $1 ~ /^[0-9]*(\.[0-9]*)?$/ {
    a[c++] = $1;
    sum += $1;
  }
  END {
    min = a[0] + 0;
    max = a[c-1] + 0;
    ave = sum / c;
    if( (c % 2) == 1 ) {
      median = a[ int(c/2) ];
    } else {
      median = ( a[c/2] + a[c/2-1] ) / 2;
    }
    OFS="\t";
    OFMT="%2.3fs";
    print c, colored(ave), colored(median), colored(min), colored(max);
  }
'
}

table_headers() {
  printf "\t\tCount\tMean\tMedian\tMin\tMax\n"
}

profile () {
  cmd="$2"
  printf '%s\t' $1
  for (( i = 0; i < 100; i++ )); do
    start=$(gdate +%s.%N)
    eval $cmd > /dev/null
    duration=$(echo "$(gdate +%s.%N) - $start" | bc)
    timings[$i]=$duration
  done
  report "${timings[@]}"
}

test_empty_repo() {
  cd_to_tmp
  git init --quiet

  table_headers
  profile "prompt.zsh" "/.$scriptDir/prompt.zsh"
  profile "prompt.bash" "/.$scriptDir/prompt.bash"

  rm_tmp
}

test_large_repo() {
  cd_to_tmp
  git clone https://github.com/Homebrew/homebrew --quiet
  cd homebrew

  table_headers
  profile "prompt.zsh" "/.$scriptDir/prompt.zsh"
  profile "prompt.bash" "/.$scriptDir/prompt.bash"

  rm_tmp
}

test_lots_of_submodules() {
  cd_to_tmp
  git clone https://github.com/michaeldfallen/dotfiles --quiet
  cd dotfiles
  git submodule update --init --quiet

  table_headers
  profile "prompt.zsh" "/.$scriptDir/prompt.zsh"
  profile "prompt.bash" "/.$scriptDir/prompt.bash"

  rm_tmp
}

. ./shunit/shunit2