Commit 574e687
authored
fix: Use .EqualFold() to parse urn prefixed UUIDs (#118)
Prior to this commit we used a comparison with the result of ToLower() to test for a "urn:uuid" prefix in both UUID strings and byte slices.
This commit replaces the ToLower and string comparison with both strings.EqualFold and bytes.EqualFold.
This reduces the CPU time across the board for UUIDs that start with "urn:uuid" and eliminates some allocations when parsing bytes.
The benchmark output was generated by adding "urn:uuid" to the test input.
```
goos: linux
goarch: amd64
pkg: github.com/google/uuid
cpu: Intel(R) Core(TM) i7-10510U CPU @ 1.80GHz
│ /tmp/output1 │ /tmp/output2 │
│ sec/op │ sec/op vs base │
Parse-8 35.87n ± ∞ ¹ 33.75n ± ∞ ¹ ~ (p=1.000 n=1) ²
ParseBytes-8 65.10n ± ∞ ¹ 35.56n ± ∞ ¹ ~ (p=1.000 n=1) ²
ParseBytesUnsafe-8 35.31n ± ∞ ¹ 34.70n ± ∞ ¹ ~ (p=1.000 n=1) ²
ParseBytesCopy-8 78.01n ± ∞ ¹ 61.21n ± ∞ ¹ ~ (p=1.000 n=1) ²
ParseBadLength-8 3.499n ± ∞ ¹ 3.084n ± ∞ ¹ ~ (p=1.000 n=1) ²
ParseLen32Truncated-8 3.335n ± ∞ ¹ 3.334n ± ∞ ¹ ~ (p=1.000 n=1) ²
ParseLen36Corrupted-8 63.02n ± ∞ ¹ 58.26n ± ∞ ¹ ~ (p=1.000 n=1) ²
geomean 24.11n 20.51n -14.92%
¹ need >= 6 samples for confidence interval at level 0.95
² need >= 4 samples to detect a difference at alpha level 0.05
│ /tmp/output1 │ /tmp/output2 │
│ B/op │ B/op vs base │
Parse-8 0.000 ± ∞ ¹ 0.000 ± ∞ ¹ ~ (p=1.000 n=1) ²
ParseBytes-8 16.00 ± ∞ ¹ 0.00 ± ∞ ¹ ~ (p=1.000 n=1) ³
ParseBytesUnsafe-8 0.000 ± ∞ ¹ 0.000 ± ∞ ¹ ~ (p=1.000 n=1) ²
ParseBytesCopy-8 48.00 ± ∞ ¹ 48.00 ± ∞ ¹ ~ (p=1.000 n=1) ²
ParseBadLength-8 0.000 ± ∞ ¹ 0.000 ± ∞ ¹ ~ (p=1.000 n=1) ²
ParseLen32Truncated-8 0.000 ± ∞ ¹ 0.000 ± ∞ ¹ ~ (p=1.000 n=1) ²
ParseLen36Corrupted-8 16.00 ± ∞ ¹ 16.00 ± ∞ ¹ ~ (p=1.000 n=1) ²
geomean ⁴ ? ⁴ ⁵
¹ need >= 6 samples for confidence interval at level 0.95
² all samples are equal
³ need >= 4 samples to detect a difference at alpha level 0.05
⁴ summaries must be >0 to compute geomean
⁵ ratios must be >0 to compute geomean
│ /tmp/output1 │ /tmp/output2 │
│ allocs/op │ allocs/op vs base │
Parse-8 0.000 ± ∞ ¹ 0.000 ± ∞ ¹ ~ (p=1.000 n=1) ²
ParseBytes-8 1.000 ± ∞ ¹ 0.000 ± ∞ ¹ ~ (p=1.000 n=1) ³
ParseBytesUnsafe-8 0.000 ± ∞ ¹ 0.000 ± ∞ ¹ ~ (p=1.000 n=1) ²
ParseBytesCopy-8 1.000 ± ∞ ¹ 1.000 ± ∞ ¹ ~ (p=1.000 n=1) ²
ParseBadLength-8 0.000 ± ∞ ¹ 0.000 ± ∞ ¹ ~ (p=1.000 n=1) ²
ParseLen32Truncated-8 0.000 ± ∞ ¹ 0.000 ± ∞ ¹ ~ (p=1.000 n=1) ²
ParseLen36Corrupted-8 1.000 ± ∞ ¹ 1.000 ± ∞ ¹ ~ (p=1.000 n=1) ²
geomean ⁴ ? ⁴ ⁵
¹ need >= 6 samples for confidence interval at level 0.95
² all samples are equal
³ need >= 4 samples to detect a difference at alpha level 0.05
⁴ summaries must be >0 to compute geomean
⁵ ratios must be >0 to compute geomean
```1 parent c91929c commit 574e687
1 file changed
+6
-4
lines changed| Original file line number | Diff line number | Diff line change | |
|---|---|---|---|
| |||
69 | 69 | | |
70 | 70 | | |
71 | 71 | | |
72 | | - | |
| 72 | + | |
73 | 73 | | |
74 | 74 | | |
75 | 75 | | |
| |||
101 | 101 | | |
102 | 102 | | |
103 | 103 | | |
104 | | - | |
| 104 | + | |
| 105 | + | |
105 | 106 | | |
106 | 107 | | |
107 | 108 | | |
| |||
117 | 118 | | |
118 | 119 | | |
119 | 120 | | |
120 | | - | |
| 121 | + | |
121 | 122 | | |
122 | 123 | | |
123 | 124 | | |
| |||
145 | 146 | | |
146 | 147 | | |
147 | 148 | | |
148 | | - | |
| 149 | + | |
| 150 | + | |
149 | 151 | | |
150 | 152 | | |
151 | 153 | | |
| |||
0 commit comments