uawk-bench

January 14, 2026 · View on GitHub

Benchmark suite for comparing AWK implementations.

Latest Results (uawk v0.2.2)

uawk wins 16/16 benchmarks vs GoAWK on Linux (10MB dataset, 10 runs).

View CI Results

Summary

vsWinsNotable
GoAWK16/16alternation 31x, email 14x, inner 14x
gawk13/16loses on ipaddr, regex, version
mawk10/16loses on anchored, charclass, inner, groupby, wordcount, suffix

Detailed Results (Linux CI)

Benchmarkuawkuawk-j4goawkgawkmawk
alternation23ms17ms719ms33ms28ms
anchored15ms15ms21ms32ms7ms
charclass17ms16ms42ms29ms9ms
count37ms24ms61ms61ms43ms
csv67ms42ms96ms117ms90ms
email23ms22ms340ms48ms631ms
filter83ms48ms108ms117ms88ms
groupby200ms108ms269ms311ms145ms
inner22ms22ms298ms42ms12ms
ipaddr46ms34ms136ms39ms103ms
regex80ms49ms248ms44ms455ms
select68ms44ms92ms127ms66ms
suffix23ms21ms50ms32ms21ms
sum74ms46ms97ms118ms80ms
version44ms33ms128ms37ms96ms
wordcount211ms108ms236ms303ms165ms

Parallel Mode Speedups (-j4)

BenchmarkSequentialParallelImprovement
wordcount211ms108ms-49%
groupby200ms108ms-46%
filter83ms48ms-42%
regex80ms49ms-39%

Test environment: Ubuntu 24.04, GitHub Actions runner, Go 1.25.5

See CHANGELOG.md for version history.

Supported AWKs

AWKDescription
uawkHigh-performance AWK in Go with coregex regex engine
goawkReference Go AWK by Ben Hoyt
gawkGNU AWK
mawkFast C AWK (Linux only)

Benchmarks

ProgramDescriptionDataPattern Type
sum.awkSum numeric columnsnumeric-
count.awkCount lines and fieldstext-
filter.awkFilter by conditionnumeric-
select.awkExtract specific fieldsnumeric-
groupby.awkGroup and aggregatekeyvalue-
wordcount.awkWord frequencytext-
regex.awkPattern [a-zA-Z]+[0-9]+textComposite
csv.awkCSV field sumcsv-
ipaddr.awkIP address matchinglogDigitPrefilter
alternation.awkLog level matchinglogAho-Corasick
email.awkEmail pattern matchingtextCharClass
suffix.awkSuffix pattern matchinglogReverse search
version.awkVersion number matchinglogDigit sequences
charclass.awkCharacter class patternstextCharClass
inner.awkInner literal patternslogInner literal
anchored.awkAnchored patternslogStart anchor

Usage

# Build
go build -o bin/awkbench ./cmd/awkbench

# Run benchmarks
./bin/awkbench -size 10MB -runs 10

# Generate data only
./bin/awkbench -generate -size 100MB

# Test specific AWKs
./bin/awkbench -awk uawk,goawk -runs 5

# Custom directories
./bin/awkbench -data ./testdata -output ./results

uawk Modes

# Default (POSIX regex)
./bin/awkbench -awk uawk

# Fast mode (non-POSIX regex)
./bin/awkbench -awk uawk-fast

# Parallel execution (v0.2.0+)
./bin/awkbench -awk uawk-j4    # 4 workers
./bin/awkbench -awk uawk-j8    # 8 workers

Note: Parallel mode (-j N) requires multiple input files to show benefit. Single-file benchmarks run sequentially.

Output

Results are written to results/ directory:

  • results.md — Markdown with detailed statistics
  • results.json — JSON for programmatic analysis
  • results.csv — CSV for spreadsheets

CI

Benchmarks run on push to main and weekly. Results are in GitHub Actions artifacts.

gh workflow run benchmark.yml -f size=100MB

Requirements

  • Go 1.25+
  • uawk, goawk (go install)
  • gawk, mawk (system packages)

License

MIT