Per-suite timing (Linux container, PostgreSQL available)
Total: ~32s
| Suite |
Time |
Tests |
ms/test |
| sequential (00–04) |
11.1s |
62 |
179 |
| doc (standard) |
1.7s |
9 |
189 |
| make-test |
1.9s |
10 |
190 |
| multi-extension |
1.3s |
14 |
93 |
| pgtle-install |
1.6s |
7 |
229 |
| gitattributes |
1.2s |
3 |
400 |
| dist-clean |
1.1s |
9 |
122 |
| make-results |
0.9s |
8 |
113 |
| update-setup-files |
0.7s |
8 |
88 |
| control-errors |
0.9s |
12 |
75 |
Foundation runs 3× (initial doc env, recursion check, main run) at ~0s/2.3s/3.6s — the second and third are the interesting ones; the third is building the real foundation, the second is a pre-check.
The sequential suite (11.1s)
Dominated by 04-pgtle.bats. Within that file the order is already logical, but three tests contain mandatory sleeps totalling 5 seconds:
| Test |
Sleep |
Why |
requires field becomes ARRAY when present |
sleep 2; touch; sleep 1 = 3s |
Ensure control file mtime > output file mtime on coarse-grained filesystems |
control file change triggers rebuild |
sleep 1 = 1s |
Same reason |
SQL file change triggers rebuild |
sleep 1 = 1s |
Same reason |
The sleep 2 in the first test is the redundant one — reducing to sleep 1; touch pattern (like the other two tests) would save 2s. New timestamp infrastructure in the other branch will address this more elegantly.
Remaining time in the sequential suite (~6s) is genuine work: git operations, make dist, make pgtle invocations.
Independent suite overhead
Each independent suite pays ~0.5s for env creation (rsync from foundation). With 8 independent suites that's ~4s of overhead.
Reordering opportunities
Reviewed each slow suite for redundant expensive operations:
gitattributes (1.2s for 3 tests — worst ms/test): Env setup + two make dist calls dominate. Tests are inherently sequential (test 1 expects failure, test 2 commits .gitattributes and expects success, test 3 inspects the archive). No reordering wins. These tests could potentially be folded into 02-dist.bats to avoid the separate env cost (~0.5s), but that changes the independent/sequential architecture.
make-test (1.9s): Contains a skip_if_no_postgres path and a make test call. Already tight.
pgtle-install (1.6s): Two make pgtle + make run-pgtle pairs (tests 3 and 6) — the second is needed to test the empty-upgrade-file scenario. No reordering wins.
doc (1.7s): Test 6 (make docclean removes documentation) opens with run make html to ensure docs exist, but docs already exist from test 4 + test 5. The make html is a no-op when files are current (make checks timestamps), so savings are negligible.
multi-extension (1.3s): Only one make all call (test 9). Tests 1–8 and 10–14 are pure file/content checks. Already tight.
update-setup-files (0.7s): setup() does git reset --hard + git clean -fd before every test. Already efficient.
Summary
The biggest wins, in order:
- 5s of sleeps in 04-pgtle — 3s reducible now (
sleep 2 → sleep 1), remainder addressed by new timestamp infrastructure (other branch)
- ~4s of independent suite env creation overhead — architectural cost, hard to eliminate without merging suites
- gitattributes ms/test ratio — 3 tests that each pay for
make dist; could be merged into 02-dist.bats to save ~0.5s env setup
- Everything else is already reasonably tight
Notes on timing methodology
~/bin/timestamp was updated to show total_elapsed +delta: line, making suite boundaries trivial to read:
9.393s + 0.098s: # Creating sequential environment...
20.541s + 0.074s: # Creating control-errors environment...
Sequential suite elapsed = 20.541 - 9.393 = 11.1s
Per-suite timing (Linux container, PostgreSQL available)
Total: ~32s
Foundation runs 3× (initial doc env, recursion check, main run) at ~0s/2.3s/3.6s — the second and third are the interesting ones; the third is building the real foundation, the second is a pre-check.
The sequential suite (11.1s)
Dominated by
04-pgtle.bats. Within that file the order is already logical, but three tests contain mandatory sleeps totalling 5 seconds:requires field becomes ARRAY when presentsleep 2; touch; sleep 1= 3scontrol file change triggers rebuildsleep 1= 1sSQL file change triggers rebuildsleep 1= 1sThe
sleep 2in the first test is the redundant one — reducing tosleep 1; touchpattern (like the other two tests) would save 2s. New timestamp infrastructure in the other branch will address this more elegantly.Remaining time in the sequential suite (~6s) is genuine work: git operations,
make dist,make pgtleinvocations.Independent suite overhead
Each independent suite pays ~0.5s for env creation (rsync from foundation). With 8 independent suites that's ~4s of overhead.
Reordering opportunities
Reviewed each slow suite for redundant expensive operations:
gitattributes (1.2s for 3 tests — worst ms/test): Env setup + two
make distcalls dominate. Tests are inherently sequential (test 1 expects failure, test 2 commits.gitattributesand expects success, test 3 inspects the archive). No reordering wins. These tests could potentially be folded into02-dist.batsto avoid the separate env cost (~0.5s), but that changes the independent/sequential architecture.make-test (1.9s): Contains a
skip_if_no_postgrespath and amake testcall. Already tight.pgtle-install (1.6s): Two
make pgtle + make run-pgtlepairs (tests 3 and 6) — the second is needed to test the empty-upgrade-file scenario. No reordering wins.doc (1.7s): Test 6 (
make docclean removes documentation) opens withrun make htmlto ensure docs exist, but docs already exist from test 4 + test 5. Themake htmlis a no-op when files are current (make checks timestamps), so savings are negligible.multi-extension (1.3s): Only one
make allcall (test 9). Tests 1–8 and 10–14 are pure file/content checks. Already tight.update-setup-files (0.7s):
setup()doesgit reset --hard + git clean -fdbefore every test. Already efficient.Summary
The biggest wins, in order:
sleep 2→sleep 1), remainder addressed by new timestamp infrastructure (other branch)make dist; could be merged into02-dist.batsto save ~0.5s env setupNotes on timing methodology
~/bin/timestampwas updated to showtotal_elapsed +delta: line, making suite boundaries trivial to read:Sequential suite elapsed = 20.541 - 9.393 = 11.1s