Closed tobz closed 2 weeks ago
Run ID: 420bc452-fbd2-429c-909c-16511f01d8c9
Baseline: 7.55.2 Comparison: 7.55.3
Performance changes are noted in the perf column of each table:
Confidence level: 90.00% Effect size tolerance: |Δ mean %| ≥ 5.00%
There were no significant changes in experiment optimization goals at this confidence level and effect size tolerance.
Run ID: 712f4263-41e8-4fda-b43d-afe3cc4f9a64
Baseline: ca65c5ba3b4b7024db10d30a08507f116f4d1a36 Comparison: 8b95bc593c0ed64f467edd2c5a1a25db3155c124
Performance changes are noted in the perf column of each table:
Confidence level: 90.00% Effect size tolerance: |Δ mean %| ≥ 5.00%
perf | experiment | goal | Δ mean % | Δ mean % CI | links |
---|---|---|---|---|---|
✅ | dsd_uds_1mb_50k_contexts_memlimit | ingress throughput | +6.91 | [+3.54, +10.27] |
experiment | link(s) |
---|---|
dsd_uds_100mb_250k_contexts | [Profiling (ADP)] [Profiling (DSD)] [SMP Dashboard] |
dsd_uds_100mb_3k_contexts | [Profiling (ADP)] [Profiling (DSD)] [SMP Dashboard] |
dsd_uds_100mb_3k_contexts_distributions_only | [Profiling (ADP)] [Profiling (DSD)] [SMP Dashboard] |
dsd_uds_10mb_3k_contexts | [Profiling (ADP)] [Profiling (DSD)] [SMP Dashboard] |
dsd_uds_1mb_3k_contexts | [Profiling (ADP)] [Profiling (DSD)] [SMP Dashboard] |
dsd_uds_1mb_50k_contexts | [Profiling (ADP)] [Profiling (DSD)] [SMP Dashboard] |
dsd_uds_1mb_50k_contexts_memlimit | [Profiling (ADP)] [Profiling (DSD)] [SMP Dashboard] |
dsd_uds_500mb_3k_contexts | [Profiling (ADP)] [Profiling (DSD)] [SMP Dashboard] |
dsd_uds_512kb_3k_contexts | [Profiling (ADP)] [Profiling (DSD)] [SMP Dashboard] |
dsd_uds_50mb_10k_contexts_no_inlining (ADP only) | [Profiling (ADP)] [SMP Dashboard] |
dsd_uds_50mb_10k_contexts_no_inlining_no_allocs (ADP only) | [Profiling (ADP)] [SMP Dashboard] |
Context
Currently,
MetaString
is four machine words (32 bytes on 64-bit) large, while a normalString
is three machine words (24 bytes). This is due to the overhead of the enum discriminant field: while only au8
is needed to encode all the discriminants, alignment requirements round this up tousize
, on top of the largest variant (String
), thus leaving us with four machine words.Overall, this is less than ideal because we're always paying just a little more in memory to store a
MetaString
than aString
, and double and quadruple the size cost of anArc<str>
andInternedString
, respectively.Solution
This PR introduces a refactored
MetaString
based on a hand-rolled enum pattern using unions. This design encodes the discriminant into the data fields themselves by virtue of valid/invalid bitpatterns for those fields, allowing us to decode the information necessary to extract the discriminant on access.MetaString
still supports all four primary variants -- owned (String
), static (&'static str
), interned (InternedString
), and inlined -- allow the maximum size of an inlined string is now 23 bytes, instead of 31 bytes, as we're limited by the overall size of the structure.