#!/bin/sh

# 1: Setup:

# $ yes | head -n10M > sl.in
# $ yes $(yes eeeaae | head -n10K | paste -s -d,) | head -n10K > ll.in
# $ yes $(yes eeeaae | head -n9 | paste -s -d,) | head -n1M > as.in
# $ yes $(yes éééááé | head -n9 | paste -s -d，) | head -n1M > mb.in

# $ yes $(yes eeeaae | head -n10K | src/paste -s -d' ') | head -n10K > llw.in
# $ yes $(yes eeeaae | head -n9 | paste -s -d' ') | head -n1M > asw.in
# $ yes $(yes éééááé | head -n9 | paste -s -d$'\xe2\x80\x83') | head -n1M > mbw.in

# 2: Run this script like:
# cut-test.sh | tee cut-test.txt

for type in sl ll as mb llw asw mbw; do
  cat $type.in >/dev/null; # cache
  for imp in '-before' '-after'; do
    echo ============ "${imp:-base}" $type ==============;
    for d in -d, -dc -d， -dç -w -b -c; do
      fields='-f1 -f10 -f100'
      test "$d" = "-b" && { fields='-b1 -b10 -b100000'; d=''; }
      test "$d" = "-c" && { fields='-c1 -c10 -c100000'; d=''; }
      for f in $fields; do
        for loc in C C.UTF-8; do
          # Skip -b for UTF-8 as no different
          test "$loc" = C.UTF-8 && echo "$f" | grep -q -- -b \
           && continue
          # Skip multi-byte delimiter for C and not allowed
          test "$loc" = C && test $(echo -n "$d" | wc -c) -ge 4 \
           && continue
          bin=src/cut${imp}
          LC_ALL=$loc $bin $f $d /dev/null 2>/dev/null &&
          hyperfine --warmup=2 -m2 -M6 \
           "LC_ALL=$loc $bin $f $d $type.in >/dev/null" ||
          printf 'Benchmark 1: %s\n  unsupported\n\n' \
           "LC_ALL=$loc $bin $f $d $type.in >/dev/null"
        done;
      done;
    done;
  done;
done

# 3: Present results with:
# cut-test-table.sh cut-test.txt > cut-test.md
#
eg="\
-- src/cut-v9.12-39-gd97b6827c
| command          |       sl |       ll |       as |       mb |      llw |      asw |      mbw |
| ---------------- | -------- | -------- | -------- | -------- | -------- | -------- | -------- |
| C -f1 -d,        |   4.9 ms | 102.7 ms |  47.4 ms |  22.9 ms | 120.0 ms |  12.0 ms |  22.7 ms |
| UTF8 -f1 -d,     |   5.2 ms | 102.6 ms |  47.6 ms |  23.2 ms | 120.7 ms |  12.0 ms |  22.8 ms |
| C -f10 -d,       |   5.2 ms | 104.2 ms | 138.5 ms |  22.5 ms | 127.8 ms |  11.9 ms |  22.5 ms |
| UTF8 -f10 -d,    |   5.4 ms | 103.2 ms | 138.0 ms |  22.9 ms | 125.0 ms |  12.2 ms |  22.6 ms |
| C -f100 -d,      |   5.5 ms | 113.4 ms | 138.3 ms |  22.9 ms | 124.2 ms |  11.9 ms |  22.5 ms |
| UTF8 -f100 -d,   |   5.5 ms | 113.5 ms | 138.2 ms |  22.7 ms | 124.9 ms |  12.2 ms |  23.1 ms |
| C -f1 -dc        |   5.3 ms | 114.4 ms |  11.2 ms |  22.7 ms | 121.0 ms |  11.9 ms |  22.6 ms |
| UTF8 -f1 -dc     |   5.4 ms | 113.7 ms |  11.5 ms |  23.3 ms | 120.3 ms |  12.0 ms |  22.9 ms |
| C -f10 -dc       |   5.1 ms | 117.6 ms |  11.3 ms |  22.8 ms | 124.3 ms |  12.0 ms |  22.4 ms |
| UTF8 -f10 -dc    |   5.4 ms | 118.7 ms |  11.9 ms |  23.3 ms | 125.4 ms |  12.1 ms |  23.2 ms |
| C -f100 -dc      |   5.3 ms | 118.4 ms |  11.3 ms |  22.7 ms | 124.6 ms |  12.3 ms |  22.5 ms |
| UTF8 -f100 -dc   |   5.5 ms | 118.4 ms |  11.5 ms |  23.4 ms | 126.1 ms |  12.2 ms |  22.7 ms |
| UTF8 -f1 -d，    |   6.1 ms | 161.8 ms |  15.4 ms |  69.9 ms | 167.7 ms |  15.9 ms |  30.2 ms |
| UTF8 -f10 -d，   |   6.8 ms | 167.3 ms |  15.1 ms | 241.4 ms | 174.1 ms |  15.9 ms |  30.7 ms |
| UTF8 -f100 -d，  |   6.2 ms | 167.3 ms |  15.1 ms | 241.3 ms | 173.0 ms |  15.9 ms |  30.2 ms |
| UTF8 -f1 -dç     |   6.2 ms | 162.1 ms |  15.1 ms |  30.5 ms | 168.4 ms |  15.9 ms |  30.4 ms |
| UTF8 -f10 -dç    |   6.0 ms | 167.2 ms |  15.2 ms |  30.7 ms | 176.2 ms |  16.1 ms |  30.3 ms |
| UTF8 -f100 -dç   |   6.2 ms | 166.4 ms |  15.1 ms |  30.6 ms | 173.8 ms |  15.9 ms |  30.9 ms |
| C -f1 -w         |   5.8 ms | 143.7 ms |  13.4 ms |  27.5 ms | 108.0 ms |  47.4 ms |  26.9 ms |
| UTF8 -f1 -w      |  86.6 ms |  1.616 s | 167.7 ms | 937.8 ms | 109.2 ms |  45.4 ms | 149.7 ms |
| C -f10 -w        |   5.8 ms | 149.6 ms |  13.4 ms |  27.1 ms | 108.8 ms | 160.8 ms |  26.9 ms |
| UTF8 -f10 -w     |  98.0 ms |  1.953 s | 206.9 ms | 926.1 ms | 110.4 ms | 204.7 ms | 869.8 ms |
| C -f100 -w       |   5.8 ms | 148.4 ms |  13.8 ms |  27.2 ms | 122.1 ms | 159.8 ms |  27.3 ms |
| UTF8 -f100 -w    |  97.1 ms |  1.949 s | 207.0 ms | 876.8 ms | 129.0 ms | 204.4 ms | 982.3 ms |
| C -b1            |  71.0 ms | 102.6 ms |  23.0 ms |  33.2 ms | 108.7 ms |  23.6 ms |  33.0 ms |
| C -b10           |  56.1 ms | 102.7 ms |  24.6 ms |  34.8 ms | 108.2 ms |  25.5 ms |  34.7 ms |
| C -b100000       |  56.0 ms | 103.1 ms |  19.4 ms |  30.3 ms | 108.5 ms |  20.0 ms |  29.7 ms |
| C -c1            |  71.2 ms | 102.1 ms |  22.9 ms |  33.9 ms | 107.9 ms |  23.6 ms |  33.0 ms |
| UTF8 -c1         |  90.3 ms | 102.3 ms |  27.9 ms |  50.4 ms | 108.2 ms |  28.3 ms |  50.1 ms |
| C -c10           |  55.7 ms | 102.6 ms |  25.8 ms |  34.6 ms | 107.8 ms |  25.3 ms |  34.4 ms |
| UTF8 -c10        |  39.0 ms | 102.8 ms |  39.2 ms | 127.4 ms | 107.9 ms |  39.8 ms | 126.9 ms |
| C -c100000       |  56.7 ms | 102.2 ms |  19.5 ms |  30.3 ms | 108.0 ms |  20.1 ms |  30.3 ms |
| UTF8 -c100000    |  38.0 ms | 103.4 ms |  18.3 ms |  29.9 ms | 109.1 ms |  19.2 ms |  29.6 ms |
"
