Skip to content

Instantly share code, notes, and snippets.

Show Gist options
  • Star 0 You must be signed in to star a gist
  • Fork 0 You must be signed in to fork a gist
  • Save benhoyt/66e33fcce9094cc11ba7e2d10bfd7657 to your computer and use it in GitHub Desktop.
Save benhoyt/66e33fcce9094cc11ba7e2d10bfd7657 to your computer and use it in GitHub Desktop.
Go switch jump tables - before and after performance using GoAWK
# NOTES
"before" is Go version go1.19-dd97871282, before the switch jump tables commits
"after" is Go version go1.19-78bea702cd, after the switch jump tables commits
# GOAWK'S GO MICROBENCHMARKS
$ benchstat -sort=delta -geomean benchmarks_before.txt benchmarks_after.txt
name old time/op new time/op delta
IncrDecr-8 141ns ± 1% 160ns ± 2% +13.59% (p=0.008 n=5+5)
IfStatement-8 147ns ± 1% 157ns ± 2% +6.59% (p=0.008 n=5+5)
CondExpr-8 147ns ± 1% 157ns ± 1% +6.55% (p=0.008 n=5+5)
BuiltinSplitSpace-8 34.7µs ± 1% 34.3µs ± 1% ~ (p=0.151 n=5+5)
BuiltinSplitRegex-8 89.0µs ± 3% 91.9µs ± 6% ~ (p=0.222 n=5+5)
BuiltinSub-8 14.0µs ± 1% 13.9µs ± 4% ~ (p=0.841 n=5+5)
BuiltinSubAmpersand-8 14.0µs ± 3% 13.7µs ± 2% ~ (p=0.222 n=5+5)
BuiltinGsub-8 16.8µs ± 3% 16.9µs ± 7% ~ (p=1.000 n=5+5)
BuiltinGsubAmpersand-8 16.5µs ± 2% 16.4µs ± 4% ~ (p=0.579 n=5+5)
BuiltinSprintf-8 7.77µs ± 2% 7.74µs ± 4% ~ (p=0.151 n=5+5)
NativeFunc-8 10.1µs ± 2% 10.0µs ± 1% ~ (p=0.056 n=5+5)
ForInLoop-8 1.62µs ± 3% 1.64µs ± 5% ~ (p=0.421 n=5+5)
SimplePattern-8 129ns ± 2% 127ns ± 2% ~ (p=0.286 n=5+5)
ConcatSmall-8 348ns ± 6% 355ns ± 3% ~ (p=0.421 n=5+5)
ArrayOperations-8 566ns ± 1% 572ns ± 0% ~ (p=0.087 n=5+5)
AugAssign-8 932ns ± 1% 945ns ± 2% ~ (p=0.095 n=5+5)
Print-8 2.21µs ± 2% 2.21µs ± 2% ~ (p=1.000 n=5+5)
RepeatExecProgram-8 13.8µs ± 6% 14.0µs ± 6% ~ (p=0.841 n=5+5)
RepeatNew-8 87.6ns ± 2% 87.7ns ± 1% ~ (p=0.690 n=5+5)
RepeatIOExecProgram-8 23.3µs ± 0% 23.3µs ± 1% ~ (p=0.841 n=5+5)
RepeatIONew-8 1.12µs ± 2% 1.11µs ± 3% ~ (p=1.000 n=5+5)
Printf-8 4.41µs ± 1% 4.33µs ± 1% -1.74% (p=0.016 n=5+5)
LocalVars-8 270ns ± 1% 264ns ± 2% -2.24% (p=0.032 n=5+5)
RegexMatch-8 1.06µs ± 1% 1.03µs ± 1% -2.37% (p=0.008 n=5+5)
GlobalVars-8 258ns ± 1% 251ns ± 0% -2.82% (p=0.008 n=5+5)
BuiltinMatch-8 2.60µs ± 0% 2.51µs ± 1% -3.44% (p=0.008 n=5+5)
ForLoop-8 2.35µs ± 1% 2.26µs ± 2% -3.69% (p=0.008 n=5+5)
GetField-8 331ns ± 4% 318ns ± 1% -3.96% (p=0.008 n=5+5)
RecursiveFunc-8 14.1µs ± 2% 13.5µs ± 1% -4.07% (p=0.008 n=5+5)
BuiltinIndex-8 993ns ± 1% 952ns ± 1% -4.16% (p=0.008 n=5+5)
FuncCall-8 2.59µs ± 1% 2.47µs ± 2% -4.46% (p=0.008 n=5+5)
SetField-8 780ns ± 1% 741ns ± 2% -4.93% (p=0.008 n=5+5)
Comparisons-8 324ns ± 2% 307ns ± 1% -5.03% (p=0.008 n=5+5)
Assign-8 253ns ± 1% 239ns ± 2% -5.48% (p=0.008 n=5+5)
BuiltinSubstr-8 736ns ± 1% 693ns ± 1% -5.93% (p=0.008 n=5+5)
BinaryOperators-8 432ns ± 1% 403ns ± 1% -6.61% (p=0.008 n=5+5)
SimpleBuiltins-8 731ns ± 2% 682ns ± 2% -6.67% (p=0.008 n=5+5)
ConcatLarge-8 1.61ms ± 3% 1.49ms ± 2% -7.47% (p=0.008 n=5+5)
BuiltinLength-8 430ns ± 1% 391ns ± 1% -9.14% (p=0.008 n=5+5)
ConcatTwo-8 101ns ± 2% 91ns ± 1% -9.94% (p=0.008 n=5+5)
[Geo mean] 1.72µs 1.69µs -1.70%
# COUNTWORDS - SUMMARY: 3.4% FASTER
0 ~/h/goawk$ cat countwords.awk
{
for (i=1; i<=NF; i++)
counts[tolower($i)]++
}
END {
for (k in counts)
print k, counts[k]
}
0 ~/h/goawk$ time ./goawk_before -f countwords.awk ../countwords/kjvbible_x10.txt >/dev/null
real 0m1.781s
user 0m1.836s
sys 0m0.016s
0 ~/h/goawk$ time ./goawk_before -f countwords.awk ../countwords/kjvbible_x10.txt >/dev/null
real 0m1.676s
user 0m1.778s
sys 0m0.024s
0 ~/h/goawk$ time ./goawk_before -f countwords.awk ../countwords/kjvbible_x10.txt >/dev/null
real 0m1.680s
user 0m1.780s
sys 0m0.036s
0 ~/h/goawk$ time ./goawk_before -f countwords.awk ../countwords/kjvbible_x10.txt >/dev/null
real 0m1.654s
user 0m1.774s
sys 0m0.017s
0 ~/h/goawk$ time ./goawk_before -f countwords.awk ../countwords/kjvbible_x10.txt >/dev/null
real 0m1.677s
user 0m1.771s
sys 0m0.049s
0 ~/h/goawk$
0 ~/h/goawk$
0 ~/h/goawk$
0 ~/h/goawk$ time ./goawk_after -f countwords.awk ../countwords/kjvbible_x10.txt >/dev/null
real 0m1.607s
user 0m1.709s
sys 0m0.036s
0 ~/h/goawk$ time ./goawk_after -f countwords.awk ../countwords/kjvbible_x10.txt >/dev/null
real 0m1.610s
user 0m1.719s
sys 0m0.036s
0 ~/h/goawk$ time ./goawk_after -f countwords.awk ../countwords/kjvbible_x10.txt >/dev/null
real 0m1.631s
user 0m1.728s
sys 0m0.029s
0 ~/h/goawk$ time ./goawk_after -f countwords.awk ../countwords/kjvbible_x10.txt >/dev/null
real 0m1.597s
user 0m1.703s
sys 0m0.024s
0 ~/h/goawk$ time ./goawk_after -f countwords.awk ../countwords/kjvbible_x10.txt >/dev/null
real 0m1.607s
user 0m1.711s
sys 0m0.021s
0 ~/h/goawk$ python3
Python 3.9.7 (default, Sep 10 2021, 14:59:43)
[GCC 11.2.0] on linux
Type "help", "copyright", "credits" or "license" for more information.
>>> (1.654-1.597)/1.654
0.0344619105199516
# SUMFIELD1 - SUMMARY: 4.3% FASTER
0 ~/h/goawk$ time ./goawk_before '{ s += $1 } END { print s }' ../countwords/kjvbible_x10.txt ../countwords/kjvbible_x10.txt
11023640
real 0m0.899s
user 0m0.939s
sys 0m0.032s
0 ~/h/goawk$ time ./goawk_before '{ s += $1 } END { print s }' ../countwords/kjvbible_x10.txt ../countwords/kjvbible_x10.txt
11023640
real 0m0.933s
user 0m0.993s
sys 0m0.012s
0 ~/h/goawk$ time ./goawk_before '{ s += $1 } END { print s }' ../countwords/kjvbible_x10.txt ../countwords/kjvbible_x10.txt
11023640
real 0m0.983s
user 0m1.005s
sys 0m0.044s
0 ~/h/goawk$ time ./goawk_before '{ s += $1 } END { print s }' ../countwords/kjvbible_x10.txt ../countwords/kjvbible_x10.txt
11023640
real 0m0.895s
user 0m0.924s
sys 0m0.048s
0 ~/h/goawk$ time ./goawk_before '{ s += $1 } END { print s }' ../countwords/kjvbible_x10.txt ../countwords/kjvbible_x10.txt
11023640
real 0m0.878s
user 0m0.933s
sys 0m0.020s
0 ~/h/goawk$
0 ~/h/goawk$
0 ~/h/goawk$
0 ~/h/goawk$ time ./goawk_after '{ s += $1 } END { print s }' ../countwords/kjvbible_x10.txt ../countwords/kjvbible_x10.txt
11023640
real 0m0.968s
user 0m1.039s
sys 0m0.000s
0 ~/h/goawk$ time ./goawk_after '{ s += $1 } END { print s }' ../countwords/kjvbible_x10.txt ../countwords/kjvbible_x10.txt
11023640
real 0m0.858s
user 0m0.864s
sys 0m0.060s
0 ~/h/goawk$ time ./goawk_after '{ s += $1 } END { print s }' ../countwords/kjvbible_x10.txt ../countwords/kjvbible_x10.txt
11023640
real 0m0.879s
user 0m0.939s
sys 0m0.012s
0 ~/h/goawk$
0 ~/h/goawk$ time ./goawk_after '{ s += $1 } END { print s }' ../countwords/kjvbible_x10.txt ../countwords/kjvbible_x10.txt
11023640
real 0m0.840s
user 0m0.863s
sys 0m0.049s
0 ~/h/goawk$ time ./goawk_after '{ s += $1 } END { print s }' ../countwords/kjvbible_x10.txt ../countwords/kjvbible_x10.txt
11023640
real 0m0.953s
user 0m1.006s
sys 0m0.017s
0 ~/h/goawk$ python3
Python 3.9.7 (default, Sep 10 2021, 14:59:43)
[GCC 11.2.0] on linux
Type "help", "copyright", "credits" or "license" for more information.
>>> (.878-.840)/.878
0.04328018223234628
# SUMLOOP - SUMMARY: 4.8% SLOWER
0 ~/h/goawk$ cat sumloop.awk
BEGIN {
for (i=0; i<10000000; i++)
sum += i+i+i+i+i
}
0 ~/h/goawk$ time ./goawk_before -f sumloop.awk
real 0m0.840s
user 0m0.839s
sys 0m0.004s
0 ~/h/goawk$ time ./goawk_before -f sumloop.awk
real 0m0.799s
user 0m0.801s
sys 0m0.000s
0 ~/h/goawk$ time ./goawk_before -f sumloop.awk
real 0m0.843s
user 0m0.842s
sys 0m0.004s
0 ~/h/goawk$ time ./goawk_before -f sumloop.awk
real 0m0.833s
user 0m0.831s
sys 0m0.004s
0 ~/h/goawk$ time ./goawk_before -f sumloop.awk
real 0m0.804s
user 0m0.802s
sys 0m0.004s
0 ~/h/goawk$
0 ~/h/goawk$
0 ~/h/goawk$ time ./goawk_after -f sumloop.awk
real 0m0.947s
user 0m0.941s
sys 0m0.008s
0 ~/h/goawk$ time ./goawk_after -f sumloop.awk
real 0m0.943s
user 0m0.942s
sys 0m0.004s
0 ~/h/goawk$ time ./goawk_after -f sumloop.awk
real 0m0.938s
user 0m0.935s
sys 0m0.004s
0 ~/h/goawk$ time ./goawk_after -f sumloop.awk
real 0m0.963s
user 0m0.962s
sys 0m0.004s
0 ~/h/goawk$ time ./goawk_before -f sumloop.awk
real 0m0.837s
user 0m0.836s
sys 0m0.004s
$ python3
Python 3.9.7 (default, Sep 10 2021, 14:59:43)
[GCC 11.2.0] on linux
Type "help", "copyright", "credits" or "license" for more information.
>>> (0.799-0.837)/0.799
-0.04755944931163945
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment