refactor: Optimize markedReader.Read() #139

Merged
nemith merged 1 commit from brb/push-rslvwlntnnzp into main 2026-08-29 00:08:41 +00:00
nemith commented 2026-01-20 22:56:46 +00:00 (Migrated from github.com)

Read() was just looping over ReadByte(). Which was really fast but this is slighly faster and perhaps more correct by doing larger reads and bytes.IndexByte to search for the deliminator.

❯ go run golang.org/x/perf/cmd/benchstat@latest before.txt after.txt
goos: darwin
goarch: arm64
pkg: nemith.io/netconf/transport
cpu: Apple M4 Max
                               │  before.txt  │              after.txt               │
                               │    sec/op    │    sec/op     vs base                │
MarkedRead/Small_200B-16         17.02n ± ∞ ¹   15.96n ± ∞ ¹       ~ (p=1.000 n=1) ²
MarkedRead/Medium_128KB-16       16.67n ± ∞ ¹   16.12n ± ∞ ¹       ~ (p=1.000 n=1) ²
MarkedRead/Large_10MB-16         17.09n ± ∞ ¹   15.90n ± ∞ ¹       ~ (p=1.000 n=1) ²
MarkedReadByte/Small_200B-16     9.139n ± ∞ ¹   8.854n ± ∞ ¹       ~ (p=1.000 n=1) ²
MarkedReadByte/Medium_128KB-16   9.093n ± ∞ ¹   9.076n ± ∞ ¹       ~ (p=1.000 n=1) ²
geomean                          13.21n         12.69n        -3.99%
¹ need >= 6 samples for confidence interval at level 0.95
² need >= 4 samples to detect a difference at alpha level 0.05

                               │  before.txt   │               after.txt               │
                               │      B/s      │      B/s       vs base                │
MarkedRead/Small_200B-16         11.27Gi ± ∞ ¹   12.02Gi ± ∞ ¹       ~ (p=1.000 n=1) ²
MarkedRead/Medium_128KB-16       7.152Ti ± ∞ ¹   7.394Ti ± ∞ ¹       ~ (p=1.000 n=1) ²
MarkedRead/Large_10MB-16         558.2Ti ± ∞ ¹   600.0Ti ± ∞ ¹       ~ (p=1.000 n=1) ²
MarkedReadByte/Small_200B-16     20.99Gi ± ∞ ¹   21.67Gi ± ∞ ¹       ~ (p=1.000 n=1) ²
MarkedReadByte/Medium_128KB-16   13.11Ti ± ∞ ¹   13.14Ti ± ∞ ¹       ~ (p=1.000 n=1) ²
geomean                          1.639Ti         1.707Ti        +4.16%
¹ need >= 6 samples for confidence interval at level 0.95
² need >= 4 samples to detect a difference at alpha level 0.05

                               │ before.txt  │              after.txt              │
                               │    B/op     │    B/op      vs base                │
MarkedRead/Small_200B-16         0.000 ± ∞ ¹   0.000 ± ∞ ¹       ~ (p=1.000 n=1) ²
MarkedRead/Medium_128KB-16       0.000 ± ∞ ¹   0.000 ± ∞ ¹       ~ (p=1.000 n=1) ²
MarkedRead/Large_10MB-16         0.000 ± ∞ ¹   0.000 ± ∞ ¹       ~ (p=1.000 n=1) ²
MarkedReadByte/Small_200B-16     0.000 ± ∞ ¹   0.000 ± ∞ ¹       ~ (p=1.000 n=1) ²
MarkedReadByte/Medium_128KB-16   0.000 ± ∞ ¹   0.000 ± ∞ ¹       ~ (p=1.000 n=1) ²
geomean                                    ³                +0.00%               ³
¹ need >= 6 samples for confidence interval at level 0.95
² all samples are equal
³ summaries must be >0 to compute geomean

                               │ before.txt  │              after.txt              │
                               │  allocs/op  │  allocs/op   vs base                │
MarkedRead/Small_200B-16         0.000 ± ∞ ¹   0.000 ± ∞ ¹       ~ (p=1.000 n=1) ²
MarkedRead/Medium_128KB-16       0.000 ± ∞ ¹   0.000 ± ∞ ¹       ~ (p=1.000 n=1) ²
MarkedRead/Large_10MB-16         0.000 ± ∞ ¹   0.000 ± ∞ ¹       ~ (p=1.000 n=1) ²
MarkedReadByte/Small_200B-16     0.000 ± ∞ ¹   0.000 ± ∞ ¹       ~ (p=1.000 n=1) ²
MarkedReadByte/Medium_128KB-16   0.000 ± ∞ ¹   0.000 ± ∞ ¹       ~ (p=1.000 n=1) ²
geomean                                    ³                +0.00%               ³
¹ need >= 6 samples for confidence interval at level 0.95
² all samples are equal
³ summaries must be >0 to compute geomean
Read() was just looping over ReadByte(). Which was really fast but this is slighly faster and perhaps more correct by doing larger reads and bytes.IndexByte to search for the deliminator. ``` ❯ go run golang.org/x/perf/cmd/benchstat@latest before.txt after.txt goos: darwin goarch: arm64 pkg: nemith.io/netconf/transport cpu: Apple M4 Max │ before.txt │ after.txt │ │ sec/op │ sec/op vs base │ MarkedRead/Small_200B-16 17.02n ± ∞ ¹ 15.96n ± ∞ ¹ ~ (p=1.000 n=1) ² MarkedRead/Medium_128KB-16 16.67n ± ∞ ¹ 16.12n ± ∞ ¹ ~ (p=1.000 n=1) ² MarkedRead/Large_10MB-16 17.09n ± ∞ ¹ 15.90n ± ∞ ¹ ~ (p=1.000 n=1) ² MarkedReadByte/Small_200B-16 9.139n ± ∞ ¹ 8.854n ± ∞ ¹ ~ (p=1.000 n=1) ² MarkedReadByte/Medium_128KB-16 9.093n ± ∞ ¹ 9.076n ± ∞ ¹ ~ (p=1.000 n=1) ² geomean 13.21n 12.69n -3.99% ¹ need >= 6 samples for confidence interval at level 0.95 ² need >= 4 samples to detect a difference at alpha level 0.05 │ before.txt │ after.txt │ │ B/s │ B/s vs base │ MarkedRead/Small_200B-16 11.27Gi ± ∞ ¹ 12.02Gi ± ∞ ¹ ~ (p=1.000 n=1) ² MarkedRead/Medium_128KB-16 7.152Ti ± ∞ ¹ 7.394Ti ± ∞ ¹ ~ (p=1.000 n=1) ² MarkedRead/Large_10MB-16 558.2Ti ± ∞ ¹ 600.0Ti ± ∞ ¹ ~ (p=1.000 n=1) ² MarkedReadByte/Small_200B-16 20.99Gi ± ∞ ¹ 21.67Gi ± ∞ ¹ ~ (p=1.000 n=1) ² MarkedReadByte/Medium_128KB-16 13.11Ti ± ∞ ¹ 13.14Ti ± ∞ ¹ ~ (p=1.000 n=1) ² geomean 1.639Ti 1.707Ti +4.16% ¹ need >= 6 samples for confidence interval at level 0.95 ² need >= 4 samples to detect a difference at alpha level 0.05 │ before.txt │ after.txt │ │ B/op │ B/op vs base │ MarkedRead/Small_200B-16 0.000 ± ∞ ¹ 0.000 ± ∞ ¹ ~ (p=1.000 n=1) ² MarkedRead/Medium_128KB-16 0.000 ± ∞ ¹ 0.000 ± ∞ ¹ ~ (p=1.000 n=1) ² MarkedRead/Large_10MB-16 0.000 ± ∞ ¹ 0.000 ± ∞ ¹ ~ (p=1.000 n=1) ² MarkedReadByte/Small_200B-16 0.000 ± ∞ ¹ 0.000 ± ∞ ¹ ~ (p=1.000 n=1) ² MarkedReadByte/Medium_128KB-16 0.000 ± ∞ ¹ 0.000 ± ∞ ¹ ~ (p=1.000 n=1) ² geomean ³ +0.00% ³ ¹ need >= 6 samples for confidence interval at level 0.95 ² all samples are equal ³ summaries must be >0 to compute geomean │ before.txt │ after.txt │ │ allocs/op │ allocs/op vs base │ MarkedRead/Small_200B-16 0.000 ± ∞ ¹ 0.000 ± ∞ ¹ ~ (p=1.000 n=1) ² MarkedRead/Medium_128KB-16 0.000 ± ∞ ¹ 0.000 ± ∞ ¹ ~ (p=1.000 n=1) ² MarkedRead/Large_10MB-16 0.000 ± ∞ ¹ 0.000 ± ∞ ¹ ~ (p=1.000 n=1) ² MarkedReadByte/Small_200B-16 0.000 ± ∞ ¹ 0.000 ± ∞ ¹ ~ (p=1.000 n=1) ² MarkedReadByte/Medium_128KB-16 0.000 ± ∞ ¹ 0.000 ± ∞ ¹ ~ (p=1.000 n=1) ² geomean ³ +0.00% ³ ¹ need >= 6 samples for confidence interval at level 0.95 ² all samples are equal ³ summaries must be >0 to compute geomean ```
nemith approved these changes 2026-08-29 00:08:35 +00:00
nemith merged commit 86a181ce29 into main 2026-08-29 00:08:41 +00:00
Sign in to join this conversation.
No description provided.