Skip to content

fix: Replace qpack::Data with trait#3013

Merged
larseggert merged 18 commits into
mozilla:mainfrom
larseggert:fix-2754
Dec 10, 2025
Merged

fix: Replace qpack::Data with trait#3013
larseggert merged 18 commits into
mozilla:mainfrom
larseggert:fix-2754

Conversation

@larseggert
Copy link
Copy Markdown
Collaborator

Fixes #2754

Copilot AI review requested due to automatic review settings September 25, 2025 14:11
Copy link
Copy Markdown
Contributor

Copilot AI left a comment

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Pull Request Overview

This PR refactors the QPACK implementation by replacing the custom qpack::Data struct with a trait-based approach. The main purpose is to eliminate code duplication and leverage the existing neqo_common::Encoder functionality for QPACK encoding operations.

Key changes:

  • Introduces QpackEncoder trait with QPACK-specific encoding methods
  • Implements the trait for neqo_common::Encoder<B> where B: Buffer
  • Updates all usage sites to use neqo_common::Encoder directly instead of custom Data struct

Reviewed Changes

Copilot reviewed 8 out of 8 changed files in this pull request and generated 2 comments.

Show a summary per file
File Description
neqo-qpack/src/qpack_send_buf.rs Replaces Data struct with QpackEncoder trait and implementation
neqo-qpack/src/lib.rs Exports the new QpackEncoder trait
neqo-qpack/src/header_block.rs Updates HeaderEncoder to use neqo_common::Encoder
neqo-qpack/src/encoder_instructions.rs Updates instruction marshaling to use trait-based approach
neqo-qpack/src/encoder.rs Replaces Data usage with neqo_common::Encoder
neqo-qpack/src/decoder_instructions.rs Updates decoder instruction marshaling
neqo-qpack/src/decoder.rs Replaces Data buffer with neqo_common::Encoder and updates buffer management
neqo-common/src/codec.rs Adds new_with_vec constructor for Encoder

Tip: Customize your code reviews with copilot-instructions.md. Create the file or learn how to get started.

Comment thread neqo-qpack/src/decoder.rs Outdated
Comment thread neqo-common/src/codec.rs Outdated
@codecov
Copy link
Copy Markdown

codecov Bot commented Sep 25, 2025

Codecov Report

❌ Patch coverage is 98.07692% with 2 lines in your changes missing coverage. Please review.
✅ Project coverage is 93.47%. Comparing base (d0a5a51) to head (bc6846f).
⚠️ Report is 50 commits behind head on main.

Additional details and impacted files
@@            Coverage Diff             @@
##             main    #3013      +/-   ##
==========================================
- Coverage   93.49%   93.47%   -0.03%     
==========================================
  Files         125      125              
  Lines       36635    36672      +37     
  Branches    36635    36672      +37     
==========================================
+ Hits        34253    34280      +27     
- Misses       1537     1546       +9     
- Partials      845      846       +1     
Components Coverage Δ
neqo-common 97.60% <100.00%> (+0.23%) ⬆️
neqo-crypto 83.17% <ø> (-0.49%) ⬇️
neqo-http3 93.30% <ø> (ø)
neqo-qpack 94.30% <95.74%> (-0.01%) ⬇️
neqo-transport 94.60% <ø> (-0.03%) ⬇️
neqo-udp 79.42% <ø> (ø)
mtu 85.44% <ø> (ø)

@github-actions
Copy link
Copy Markdown
Contributor

github-actions Bot commented Sep 25, 2025

🐰 Bencher Report

Branchfix-2754
TestbedOn-prem
Click to view all benchmark results
BenchmarkLatencyBenchmark Result
nanoseconds (ns)
(Result Δ%)
Upper Boundary
nanoseconds (ns)
(Limit %)
1-conn/1-100mb-req/mtu-1504 (aka. Upload)/client📈 view plot
🚷 view threshold
207,670,000.00 ns
(+0.03%)Baseline: 207,598,774.19 ns
216,986,973.93 ns
(95.71%)
1-conn/1-100mb-resp/mtu-1504 (aka. Download)/client📈 view plot
🚷 view threshold
199,250,000.00 ns
(-1.27%)Baseline: 201,807,419.35 ns
211,771,059.64 ns
(94.09%)
1-conn/1-1b-resp/mtu-1504 (aka. HPS)/client📈 view plot
🚷 view threshold
38,786,000.00 ns
(+15.88%)Baseline: 33,470,711.83 ns
45,520,216.60 ns
(85.21%)
1-conn/10_000-parallel-1b-resp/mtu-1504 (aka. RPS)/client📈 view plot
🚷 view threshold
286,590,000.00 ns
(-1.07%)Baseline: 289,694,215.05 ns
302,885,529.80 ns
(94.62%)
1-streams/each-1000-bytes/simulated-time📈 view plot
🚷 view threshold
119,260,000.00 ns
(+0.41%)Baseline: 118,777,935.48 ns
120,583,291.95 ns
(98.90%)
1-streams/each-1000-bytes/wallclock-time📈 view plot
🚷 view threshold
583,320.00 ns
(-1.23%)Baseline: 590,561.29 ns
612,134.00 ns
(95.29%)
1000-streams/each-1-bytes/simulated-time📈 view plot
🚷 view threshold
2,331,400,000.00 ns
(-78.03%)Baseline: 10,611,516,774.19 ns
24,675,479,358.68 ns
(9.45%)
1000-streams/each-1-bytes/wallclock-time📈 view plot
🚷 view threshold
12,399,000.00 ns
(-8.21%)Baseline: 13,507,668.82 ns
15,216,153.93 ns
(81.49%)
1000-streams/each-1000-bytes/simulated-time📈 view plot
🚷 view threshold
16,392,000,000.00 ns
(-9.26%)Baseline: 18,065,079,569.89 ns
20,963,297,942.79 ns
(78.19%)
1000-streams/each-1000-bytes/wallclock-time📈 view plot
🚷 view threshold
49,691,000.00 ns
(-1.83%)Baseline: 50,616,086.02 ns
56,171,436.00 ns
(88.46%)
RxStreamOrderer::inbound_frame()📈 view plot
🚷 view threshold
108,550,000.00 ns
(-1.06%)Baseline: 109,709,698.92 ns
111,433,327.91 ns
(97.41%)
coalesce_acked_from_zero 1+1 entries📈 view plot
🚷 view threshold
89.35 ns
(+0.35%)Baseline: 89.04 ns
90.34 ns
(98.90%)
coalesce_acked_from_zero 10+1 entries📈 view plot
🚷 view threshold
105.68 ns
(-0.34%)Baseline: 106.04 ns
107.13 ns
(98.65%)
coalesce_acked_from_zero 1000+1 entries📈 view plot
🚷 view threshold
91.54 ns
(+0.89%)Baseline: 90.73 ns
95.16 ns
(96.20%)
coalesce_acked_from_zero 3+1 entries📈 view plot
🚷 view threshold
106.35 ns
(-0.18%)Baseline: 106.54 ns
107.57 ns
(98.87%)
decode 1048576 bytes, mask 3f📈 view plot
🚷 view threshold
1,759,700.00 ns
(+5.40%)Baseline: 1,669,470.97 ns
1,873,606.48 ns
(93.92%)
decode 1048576 bytes, mask 7f📈 view plot
🚷 view threshold
5,066,100.00 ns
(+0.10%)Baseline: 5,061,240.43 ns
5,107,419.06 ns
(99.19%)
decode 1048576 bytes, mask ff📈 view plot
🚷 view threshold
3,000,900.00 ns
(-0.72%)Baseline: 3,022,815.27 ns
3,056,742.79 ns
(98.17%)
decode 4096 bytes, mask 3f📈 view plot
🚷 view threshold
6,213.20 ns
(-12.13%)Baseline: 7,070.89 ns
9,911.44 ns
(62.69%)
decode 4096 bytes, mask 7f📈 view plot
🚷 view threshold
19,608.00 ns
(-0.77%)Baseline: 19,760.50 ns
20,356.95 ns
(96.32%)
decode 4096 bytes, mask ff📈 view plot
🚷 view threshold
11,363.00 ns
(-0.01%)Baseline: 11,364.29 ns
12,360.19 ns
(91.93%)
sent::Packets::take_ranges📈 view plot
🚷 view threshold
4,573.30 ns
(-2.53%)Baseline: 4,691.96 ns
4,938.68 ns
(92.60%)
transfer/pacing-false/same-seed/simulated-time/run📈 view plot
🚷 view threshold
25,234,000,000.00 ns
(-0.51%)Baseline: 25,364,533,477.32 ns
25,926,320,852.70 ns
(97.33%)
transfer/pacing-false/same-seed/wallclock-time/run📈 view plot
🚷 view threshold
25,711,000.00 ns
(+0.96%)Baseline: 25,465,593.95 ns
27,008,456.39 ns
(95.20%)
transfer/pacing-false/varying-seeds/simulated-time/run📈 view plot
🚷 view threshold
25,172,000,000.00 ns
(-0.03%)Baseline: 25,180,246,220.30 ns
25,231,976,704.33 ns
(99.76%)
transfer/pacing-false/varying-seeds/wallclock-time/run📈 view plot
🚷 view threshold
25,505,000.00 ns
(-0.40%)Baseline: 25,607,412.53 ns
27,191,224.55 ns
(93.80%)
transfer/pacing-true/same-seed/simulated-time/run📈 view plot
🚷 view threshold
25,069,000,000.00 ns
(-1.51%)Baseline: 25,452,710,583.15 ns
26,018,173,667.35 ns
(96.35%)
transfer/pacing-true/same-seed/wallclock-time/run📈 view plot
🚷 view threshold
26,487,000.00 ns
(-0.87%)Baseline: 26,719,701.94 ns
28,613,277.93 ns
(92.57%)
transfer/pacing-true/varying-seeds/simulated-time/run📈 view plot
🚷 view threshold
24,978,000,000.00 ns
(-0.08%)Baseline: 24,997,159,827.21 ns
25,045,791,138.16 ns
(99.73%)
transfer/pacing-true/varying-seeds/wallclock-time/run📈 view plot
🚷 view threshold
26,186,000.00 ns
(+0.22%)Baseline: 26,127,609.07 ns
27,751,458.19 ns
(94.36%)
🐰 View full continuous benchmarking report in Bencher

- Add efficient drain method to Encoder<Vec<u8>> following Rust semantics
- Replace inefficient buffer management in QPACK decoder that was
  converting Encoder to Vec and back with direct drain() call
- Improve documentation for new_with_vec method to clarify behavior
  with existing buffer data

Eliminates unnecessary allocations and follows idiomatic Rust patterns.
@larseggert larseggert marked this pull request as ready for review September 25, 2025 18:09
Copilot AI review requested due to automatic review settings September 25, 2025 18:09
Copy link
Copy Markdown
Contributor

Copilot AI left a comment

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Pull Request Overview

Copilot reviewed 8 out of 8 changed files in this pull request and generated 1 comment.


Tip: Customize your code reviews with copilot-instructions.md. Create the file or learn how to get started.

Comment thread neqo-common/src/codec.rs Outdated
Copy link
Copy Markdown
Member

@mxinden mxinden left a comment

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

In favor of the extension trait pattern. Seems more ergonomic.

Comment thread neqo-common/src/codec.rs Outdated
Comment thread neqo-qpack/src/decoder.rs Outdated
Comment thread neqo-qpack/src/qpack_send_buf.rs Outdated
Comment thread neqo-qpack/src/qpack_send_buf.rs Outdated
Co-authored-by: Max Inden <[email protected]>
Signed-off-by: Lars Eggert <[email protected]>
Copilot AI review requested due to automatic review settings October 10, 2025 14:22
Copy link
Copy Markdown
Contributor

Copilot AI left a comment

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Pull Request Overview

Copilot reviewed 8 out of 8 changed files in this pull request and generated 2 comments.


Tip: Customize your code reviews with copilot-instructions.md. Create the file or learn how to get started.

Comment thread neqo-qpack/src/decoder.rs Outdated
Comment thread neqo-common/src/codec.rs Outdated
Co-authored-by: Max Inden <[email protected]>
Signed-off-by: Lars Eggert <[email protected]>
Copilot AI review requested due to automatic review settings October 12, 2025 06:38
Co-authored-by: Copilot <[email protected]>
Signed-off-by: Lars Eggert <[email protected]>
Copy link
Copy Markdown
Contributor

Copilot AI left a comment

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Pull Request Overview

Copilot reviewed 8 out of 8 changed files in this pull request and generated 1 comment.


Tip: Customize your code reviews with copilot-instructions.md. Create the file or learn how to get started.

Comment thread neqo-qpack/src/decoder.rs Outdated
Co-authored-by: Copilot <[email protected]>
Signed-off-by: Lars Eggert <[email protected]>
Copilot AI review requested due to automatic review settings October 12, 2025 06:39
Copy link
Copy Markdown
Contributor

Copilot AI left a comment

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Pull Request Overview

Copilot reviewed 8 out of 8 changed files in this pull request and generated 1 comment.


Tip: Customize your code reviews with copilot-instructions.md. Create the file or learn how to get started.

Comment thread neqo-common/src/codec.rs
@larseggert larseggert requested a review from Copilot October 12, 2025 06:40
Copy link
Copy Markdown
Contributor

Copilot AI left a comment

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Pull Request Overview

Copilot reviewed 8 out of 8 changed files in this pull request and generated no new comments.


Tip: Customize your code reviews with copilot-instructions.md. Create the file or learn how to get started.

Co-authored-by: Copilot <[email protected]>
Signed-off-by: Lars Eggert <[email protected]>
Copilot AI review requested due to automatic review settings October 12, 2025 06:41
Copy link
Copy Markdown
Contributor

Copilot AI left a comment

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Pull Request Overview

Copilot reviewed 8 out of 8 changed files in this pull request and generated no new comments.


Tip: Customize your code reviews with copilot-instructions.md. Create the file or learn how to get started.

Copilot AI review requested due to automatic review settings October 14, 2025 10:37
Copy link
Copy Markdown
Contributor

Copilot AI left a comment

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Pull Request Overview

Copilot reviewed 8 out of 8 changed files in this pull request and generated 1 comment.


Tip: Customize your code reviews with copilot-instructions.md. Create the file or learn how to get started.

Comment thread neqo-qpack/src/qpack_send_buf.rs
@larseggert larseggert requested a review from mxinden October 14, 2025 10:48
Comment thread neqo-common/src/codec.rs
Copilot AI review requested due to automatic review settings November 12, 2025 06:53
Copy link
Copy Markdown
Contributor

Copilot AI left a comment

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Pull Request Overview

Copilot reviewed 7 out of 7 changed files in this pull request and generated 1 comment.

Comment thread neqo-qpack/src/header_block.rs Outdated
@codspeed-hq
Copy link
Copy Markdown

codspeed-hq Bot commented Nov 12, 2025

CodSpeed Performance Report

Merging #3013 will improve performances by 10.94%

Comparing larseggert:fix-2754 (366fd52) with main (b9c32c7)

Summary

⚡ 1 improvement
✅ 22 untouched

Benchmarks breakdown

Mode Benchmark BASE HEAD Change
Simulation client 852.3 ms 768.3 ms +10.94%

Copilot AI review requested due to automatic review settings November 27, 2025 15:46
Copy link
Copy Markdown
Contributor

Copilot AI left a comment

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Pull request overview

Copilot reviewed 7 out of 7 changed files in this pull request and generated 2 comments.

Comment thread neqo-qpack/src/decoder.rs Outdated
Comment thread neqo-common/src/codec.rs
Copy link
Copy Markdown
Contributor

Copilot AI left a comment

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Pull request overview

Copilot reviewed 7 out of 7 changed files in this pull request and generated 3 comments.

Comment thread neqo-common/src/codec.rs
Comment on lines +222 to +229
impl Clone for Encoder {
fn clone(&self) -> Self {
Self {
buf: self.as_ref().to_vec(),
start: 0,
}
}
}
Copy link

Copilot AI Nov 27, 2025

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

The Clone implementation behavior (not cloning skipped bytes and resetting start to 0) is subtle and should be documented. Add a doc comment explaining that cloning produces a new encoder containing only the visible (non-skipped) portion of the buffer, with the start offset reset to 0.

Copilot uses AI. Check for mistakes.
Comment thread neqo-common/src/codec.rs
Comment on lines +231 to +235
impl<B: Buffer> PartialEq for Encoder<B> {
fn eq(&self, other: &Self) -> bool {
self.as_ref() == other.as_ref()
}
}
Copy link

Copilot AI Nov 27, 2025

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

The PartialEq implementation compares only the visible bytes (respecting skip). This semantic change from the original derived implementation should be documented. Add a doc comment explaining that equality is based on the logical view of the buffer after accounting for skipped bytes.

Copilot uses AI. Check for mistakes.
Comment thread neqo-common/src/codec.rs
Comment on lines +428 to +437
/// Skip the first `n` bytes from the encoder buffer without copying.
/// This advances the internal offset, making those bytes inaccessible.
///
/// # Panics
///
/// Panics if `n` is greater than the current length of the encoder.
pub fn skip(&mut self, n: usize) {
assert!(n <= self.len(), "Cannot skip beyond buffer length");
self.start += n;
}
Copy link

Copilot AI Nov 27, 2025

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

The documentation for skip() should clarify that this method is only available for Encoder<Vec<u8>>, not for generic Encoder<B> where B: Buffer. This is important because the method is defined in an impl Encoder<Vec<u8>> block, not impl<B: Buffer> Encoder<B>.

Copilot uses AI. Check for mistakes.
@github-actions
Copy link
Copy Markdown
Contributor

Failed Interop Tests

QUIC Interop Runner, client vs. server, differences relative to 126b1df.

neqo-latest as clientneqo-latest as server
neqo-latest vs. aioquic: A 🚀L1
neqo-latest vs. go-x-net: A BP BA
neqo-latest vs. haproxy: A ⚠️L1 BP BA
neqo-latest vs. kwik: BP BA
neqo-latest vs. linuxquic: A L1 ⚠️C1
neqo-latest vs. lsquic: run cancelled after 20 min
neqo-latest vs. msquic: ⚠️R Z A L1 🚀L2 C1
neqo-latest vs. mvfst: A L1 C1 ⚠️BA
neqo-latest vs. nginx: A L1 ⚠️C1 BP BA
neqo-latest vs. ngtcp2: A L1 🚀C1 CM
neqo-latest vs. picoquic: ⚠️Z A L1 C1
neqo-latest vs. quic-go: A 🚀L1 ⚠️C1
neqo-latest vs. quiche: A 🚀L1 C1 BP BA
neqo-latest vs. quinn: A 🚀C1
neqo-latest vs. s2n-quic: A BA CM
neqo-latest vs. tquic: S A BP BA
neqo-latest vs. xquic: A ⚠️C1
aioquic vs. neqo-latest: CM
chrome vs. neqo-latest: 3
go-x-net vs. neqo-latest: CM
kwik vs. neqo-latest: BP BA CM
msquic vs. neqo-latest: 🚀BP CM
mvfst vs. neqo-latest: Z A L1 C1 CM
openssl vs. neqo-latest: LR M A CM
quic-go vs. neqo-latest: CM
quiche vs. neqo-latest: 🚀C1 CM
quinn vs. neqo-latest: V2 CM
s2n-quic vs. neqo-latest: ⚠️L1 CM
tquic vs. neqo-latest: CM
xquic vs. neqo-latest: M CM
All results

Succeeded Interop Tests

QUIC Interop Runner, client vs. server

neqo-latest as client

neqo-latest as server

Unsupported Interop Tests

QUIC Interop Runner, client vs. server

neqo-latest as client

neqo-latest as server

@github-actions
Copy link
Copy Markdown
Contributor

Client/server transfer results

Performance differences relative to d0a5a51.

Transfer of 33554432 bytes over loopback, 1504-byte MTU, min. 100 runs. All unit-less numbers are in milliseconds.

Client vs. server (params) Mean ± σ Min Max MiB/s ± σ Δ main Δ main
google vs. neqo (cubic, paced) 278.2 ± 4.3 269.1 293.2 115.0 ± 7.4 💔 2.0 0.7%
neqo vs. neqo (cubic, paced) 99.6 ± 4.2 91.7 106.6 321.4 ± 7.6 💔 3.6 3.7%
neqo vs. neqo (reno) 95.7 ± 3.8 86.9 104.6 334.5 ± 8.4 💚 -2.4 -2.4%
neqo vs. neqo (reno, paced) 98.0 ± 4.1 88.6 106.2 326.5 ± 7.8 💔 1.4 1.4%
neqo vs. s2n (cubic, paced) 222.2 ± 4.7 212.3 233.6 144.0 ± 6.8 💔 2.4 1.1%

Table above only shows statistically significant changes. See all results below.

All results

Transfer of 33554432 bytes over loopback, 1504-byte MTU, min. 100 runs. All unit-less numbers are in milliseconds.

Client vs. server (params) Mean ± σ Min Max MiB/s ± σ Δ main Δ main
google vs. google 455.3 ± 4.3 449.0 473.8 70.3 ± 7.4
google vs. neqo (cubic, paced) 278.2 ± 4.3 269.1 293.2 115.0 ± 7.4 💔 2.0 0.7%
msquic vs. msquic 204.8 ± 76.2 142.9 475.5 156.3 ± 0.4
msquic vs. neqo (cubic, paced) 222.6 ± 77.4 151.5 580.6 143.8 ± 0.4 -17.7 -7.4%
neqo vs. google (cubic, paced) 756.0 ± 3.8 750.7 774.0 42.3 ± 8.4 -0.5 -0.1%
neqo vs. msquic (cubic, paced) 157.7 ± 4.5 150.6 165.6 202.9 ± 7.1 1.1 0.7%
neqo vs. neqo (cubic) 96.0 ± 4.2 88.6 106.7 333.4 ± 7.6 -1.1 -1.1%
neqo vs. neqo (cubic, paced) 99.6 ± 4.2 91.7 106.6 321.4 ± 7.6 💔 3.6 3.7%
neqo vs. neqo (reno) 95.7 ± 3.8 86.9 104.6 334.5 ± 8.4 💚 -2.4 -2.4%
neqo vs. neqo (reno, paced) 98.0 ± 4.1 88.6 106.2 326.5 ± 7.8 💔 1.4 1.4%
neqo vs. quiche (cubic, paced) 191.9 ± 3.4 186.6 205.9 166.8 ± 9.4 -0.1 -0.1%
neqo vs. s2n (cubic, paced) 222.2 ± 4.7 212.3 233.6 144.0 ± 6.8 💔 2.4 1.1%
quiche vs. neqo (cubic, paced) 155.3 ± 6.4 140.8 190.3 206.1 ± 5.0 -0.2 -0.1%
quiche vs. quiche 146.4 ± 4.6 139.9 157.8 218.6 ± 7.0
s2n vs. neqo (cubic, paced) 171.6 ± 4.3 163.4 185.3 186.5 ± 7.4 0.0 0.0%
s2n vs. s2n 249.1 ± 27.3 233.2 375.6 128.4 ± 1.2

Download data for profiler.firefox.com or download performance comparison data.

@github-actions
Copy link
Copy Markdown
Contributor

Benchmark results

Significant performance differences relative to d0a5a51.

RxStreamOrderer::inbound_frame(): 💚 Performance has improved by -1.6156%.
       time:   [108.49 ms 108.55 ms 108.62 ms]
       change: [-1.8839% -1.6156% -1.4385] (p = 0.00 < 0.05)
       Performance has improved.
Found 23 outliers among 100 measurements (23.00%)
5 (5.00%) low severe
7 (7.00%) low mild
7 (7.00%) high mild
4 (4.00%) high severe
transfer/pacing-false/same-seed/wallclock-time/run: 💔 Performance has regressed by +3.2960%.
       time:   [25.675 ms 25.711 ms 25.763 ms]
       change: [+3.0921% +3.2960% +3.5251] (p = 0.00 < 0.05)
       Performance has regressed.
Found 1 outliers among 100 measurements (1.00%)
1 (1.00%) high severe
transfer/pacing-true/same-seed/wallclock-time/run: 💔 Performance has regressed by +3.6718%.
       time:   [26.464 ms 26.487 ms 26.510 ms]
       change: [+3.5007% +3.6718% +3.8243] (p = 0.00 < 0.05)
       Performance has regressed.
Found 4 outliers among 100 measurements (4.00%)
2 (2.00%) low mild
1 (1.00%) high mild
1 (1.00%) high severe
All results
1-conn/1-100mb-resp/mtu-1504 (aka. Download)/client: No change in performance detected.
       time:   [198.88 ms 199.25 ms 199.63 ms]
       thrpt:  [500.94 MiB/s 501.89 MiB/s 502.82 MiB/s]
change:
       time:   [-0.4089% -0.0506% +0.2859] (p = 0.78 > 0.05)
       thrpt:  [-0.2851% +0.0506% +0.4105]
       No change in performance detected.
Found 2 outliers among 100 measurements (2.00%)
2 (2.00%) high mild
1-conn/10_000-parallel-1b-resp/mtu-1504 (aka. RPS)/client: No change in performance detected.
       time:   [284.85 ms 286.59 ms 288.33 ms]
       thrpt:  [34.683 Kelem/s 34.893 Kelem/s 35.107 Kelem/s]
change:
       time:   [-0.1659% +0.7532% +1.5898] (p = 0.11 > 0.05)
       thrpt:  [-1.5649% -0.7476% +0.1662]
       No change in performance detected.
1-conn/1-1b-resp/mtu-1504 (aka. HPS)/client: No change in performance detected.
       time:   [38.638 ms 38.786 ms 38.965 ms]
       thrpt:  [25.664   B/s 25.782   B/s 25.881   B/s]
change:
       time:   [-1.4233% -0.7072% +0.0362] (p = 0.06 > 0.05)
       thrpt:  [-0.0362% +0.7122% +1.4439]
       No change in performance detected.
Found 4 outliers among 100 measurements (4.00%)
4 (4.00%) high severe
1-conn/1-100mb-req/mtu-1504 (aka. Upload)/client: Change within noise threshold.
       time:   [207.32 ms 207.67 ms 208.08 ms]
       thrpt:  [480.58 MiB/s 481.52 MiB/s 482.34 MiB/s]
change:
       time:   [-0.7944% -0.4659% -0.1670] (p = 0.00 < 0.05)
       thrpt:  [+0.1673% +0.4681% +0.8008]
       Change within noise threshold.
Found 3 outliers among 100 measurements (3.00%)
1 (1.00%) low mild
1 (1.00%) high mild
1 (1.00%) high severe
decode 4096 bytes, mask ff: No change in performance detected.
       time:   [11.325 µs 11.363 µs 11.409 µs]
       change: [-0.3998% +0.0384% +0.4978] (p = 0.86 > 0.05)
       No change in performance detected.
Found 16 outliers among 100 measurements (16.00%)
1 (1.00%) low severe
3 (3.00%) low mild
12 (12.00%) high severe
decode 1048576 bytes, mask ff: No change in performance detected.
       time:   [2.9915 ms 3.0009 ms 3.0120 ms]
       change: [-0.7569% -0.2517% +0.2570] (p = 0.34 > 0.05)
       No change in performance detected.
Found 11 outliers among 100 measurements (11.00%)
2 (2.00%) low mild
1 (1.00%) high mild
8 (8.00%) high severe
decode 4096 bytes, mask 7f: No change in performance detected.
       time:   [19.561 µs 19.608 µs 19.662 µs]
       change: [-0.3682% +0.1912% +1.0585] (p = 0.66 > 0.05)
       No change in performance detected.
Found 18 outliers among 100 measurements (18.00%)
1 (1.00%) low severe
5 (5.00%) low mild
2 (2.00%) high mild
10 (10.00%) high severe
decode 1048576 bytes, mask 7f: No change in performance detected.
       time:   [5.0337 ms 5.0661 ms 5.1198 ms]
       change: [-0.3166% +0.4679% +1.5202] (p = 0.42 > 0.05)
       No change in performance detected.
Found 15 outliers among 100 measurements (15.00%)
15 (15.00%) high severe
decode 4096 bytes, mask 3f: No change in performance detected.
       time:   [6.2053 µs 6.2132 µs 6.2297 µs]
       change: [-1.9253% +4.5795% +15.873] (p = 0.64 > 0.05)
       No change in performance detected.
Found 15 outliers among 100 measurements (15.00%)
9 (9.00%) low mild
3 (3.00%) high mild
3 (3.00%) high severe
decode 1048576 bytes, mask 3f: No change in performance detected.
       time:   [1.7582 ms 1.7597 ms 1.7626 ms]
       change: [-0.7263% -0.1451% +0.2539] (p = 0.76 > 0.05)
       No change in performance detected.
Found 5 outliers among 100 measurements (5.00%)
1 (1.00%) high mild
4 (4.00%) high severe
1-streams/each-1000-bytes/wallclock-time: Change within noise threshold.
       time:   [581.12 µs 583.32 µs 585.77 µs]
       change: [-2.1256% -1.3365% -0.6649] (p = 0.00 < 0.05)
       Change within noise threshold.
Found 9 outliers among 100 measurements (9.00%)
9 (9.00%) high severe
1-streams/each-1000-bytes/simulated-time: No change in performance detected.
       time:   [119.03 ms 119.26 ms 119.50 ms]
       thrpt:  [8.1724 KiB/s 8.1883 KiB/s 8.2041 KiB/s]
change:
       time:   [-0.0203% +0.2361% +0.4869] (p = 0.08 > 0.05)
       thrpt:  [-0.4845% -0.2356% +0.0203]
       No change in performance detected.
Found 1 outliers among 100 measurements (1.00%)
1 (1.00%) high mild
1000-streams/each-1-bytes/wallclock-time: Change within noise threshold.
       time:   [12.362 ms 12.399 ms 12.436 ms]
       change: [-0.8905% -0.4448% +0.0032] (p = 0.04 < 0.05)
       Change within noise threshold.
Found 1 outliers among 100 measurements (1.00%)
1 (1.00%) high mild
1000-streams/each-1-bytes/simulated-time: No change in performance detected.
       time:   [2.3280 s 2.3314 s 2.3348 s]
       thrpt:  [428.31   B/s 428.93   B/s 429.55   B/s]
change:
       time:   [-0.4122% -0.1768% +0.0504] (p = 0.14 > 0.05)
       thrpt:  [-0.0504% +0.1771% +0.4139]
       No change in performance detected.
Found 1 outliers among 100 measurements (1.00%)
1 (1.00%) high mild
1000-streams/each-1000-bytes/wallclock-time: Change within noise threshold.
       time:   [49.580 ms 49.691 ms 49.800 ms]
       change: [-1.2591% -0.9410% -0.6178] (p = 0.00 < 0.05)
       Change within noise threshold.
1000-streams/each-1000-bytes/simulated-time: No change in performance detected.
       time:   [16.140 s 16.392 s 16.650 s]
       thrpt:  [58.653 KiB/s 59.574 KiB/s 60.506 KiB/s]
change:
       time:   [-1.3342% +0.7584% +2.9843] (p = 0.50 > 0.05)
       thrpt:  [-2.8978% -0.7527% +1.3523]
       No change in performance detected.
coalesce_acked_from_zero 1+1 entries: No change in performance detected.
       time:   [89.090 ns 89.348 ns 89.604 ns]
       change: [-0.4063% -0.0351% +0.3374] (p = 0.86 > 0.05)
       No change in performance detected.
Found 8 outliers among 100 measurements (8.00%)
6 (6.00%) high mild
2 (2.00%) high severe
coalesce_acked_from_zero 3+1 entries: No change in performance detected.
       time:   [105.99 ns 106.35 ns 106.74 ns]
       change: [-0.3251% +0.1064% +0.5465] (p = 0.65 > 0.05)
       No change in performance detected.
Found 13 outliers among 100 measurements (13.00%)
13 (13.00%) high severe
coalesce_acked_from_zero 10+1 entries: No change in performance detected.
       time:   [105.28 ns 105.68 ns 106.16 ns]
       change: [-0.8377% +0.7389% +3.6013] (p = 0.65 > 0.05)
       No change in performance detected.
Found 12 outliers among 100 measurements (12.00%)
2 (2.00%) low severe
2 (2.00%) low mild
8 (8.00%) high severe
coalesce_acked_from_zero 1000+1 entries: No change in performance detected.
       time:   [91.421 ns 91.539 ns 91.669 ns]
       change: [-6.8481% -2.3249% +0.3928] (p = 0.35 > 0.05)
       No change in performance detected.
Found 8 outliers among 100 measurements (8.00%)
3 (3.00%) high mild
5 (5.00%) high severe
RxStreamOrderer::inbound_frame(): 💚 Performance has improved by -1.6156%.
       time:   [108.49 ms 108.55 ms 108.62 ms]
       change: [-1.8839% -1.6156% -1.4385] (p = 0.00 < 0.05)
       Performance has improved.
Found 23 outliers among 100 measurements (23.00%)
5 (5.00%) low severe
7 (7.00%) low mild
7 (7.00%) high mild
4 (4.00%) high severe
sent::Packets::take_ranges: No change in performance detected.
       time:   [4.4855 µs 4.5733 µs 4.6539 µs]
       change: [-2.1915% +6.5395% +21.160] (p = 0.42 > 0.05)
       No change in performance detected.
Found 2 outliers among 100 measurements (2.00%)
1 (1.00%) high mild
1 (1.00%) high severe
transfer/pacing-false/varying-seeds/wallclock-time/run: Change within noise threshold.
       time:   [25.456 ms 25.505 ms 25.562 ms]
       change: [+0.4535% +0.7072% +0.9809] (p = 0.00 < 0.05)
       Change within noise threshold.
Found 4 outliers among 100 measurements (4.00%)
1 (1.00%) low mild
2 (2.00%) high mild
1 (1.00%) high severe
transfer/pacing-false/varying-seeds/simulated-time/run: No change in performance detected.
       time:   [25.140 s 25.172 s 25.204 s]
       thrpt:  [162.51 KiB/s 162.72 KiB/s 162.93 KiB/s]
change:
       time:   [-0.3591% -0.1534% +0.0421] (p = 0.13 > 0.05)
       thrpt:  [-0.0421% +0.1536% +0.3604]
       No change in performance detected.
transfer/pacing-true/varying-seeds/wallclock-time/run: Change within noise threshold.
       time:   [26.129 ms 26.186 ms 26.245 ms]
       change: [+2.3218% +2.6805% +3.0390] (p = 0.00 < 0.05)
       Change within noise threshold.
Found 5 outliers among 100 measurements (5.00%)
1 (1.00%) low mild
4 (4.00%) high mild
transfer/pacing-true/varying-seeds/simulated-time/run: No change in performance detected.
       time:   [24.936 s 24.978 s 25.020 s]
       thrpt:  [163.71 KiB/s 163.99 KiB/s 164.26 KiB/s]
change:
       time:   [-0.4446% -0.2106% +0.0277] (p = 0.08 > 0.05)
       thrpt:  [-0.0276% +0.2111% +0.4466]
       No change in performance detected.
transfer/pacing-false/same-seed/wallclock-time/run: 💔 Performance has regressed by +3.2960%.
       time:   [25.675 ms 25.711 ms 25.763 ms]
       change: [+3.0921% +3.2960% +3.5251] (p = 0.00 < 0.05)
       Performance has regressed.
Found 1 outliers among 100 measurements (1.00%)
1 (1.00%) high severe
transfer/pacing-false/same-seed/simulated-time/run: No change in performance detected.
       time:   [25.234 s 25.234 s 25.234 s]
       thrpt:  [162.32 KiB/s 162.32 KiB/s 162.32 KiB/s]
change:
       time:   [+0.0000% +0.0000% +0.0000] (p = NaN > 0.05)
       thrpt:  [+0.0000% +0.0000% +0.0000]
       No change in performance detected.
transfer/pacing-true/same-seed/wallclock-time/run: 💔 Performance has regressed by +3.6718%.
       time:   [26.464 ms 26.487 ms 26.510 ms]
       change: [+3.5007% +3.6718% +3.8243] (p = 0.00 < 0.05)
       Performance has regressed.
Found 4 outliers among 100 measurements (4.00%)
2 (2.00%) low mild
1 (1.00%) high mild
1 (1.00%) high severe
transfer/pacing-true/same-seed/simulated-time/run: No change in performance detected.
       time:   [25.069 s 25.069 s 25.069 s]
       thrpt:  [163.39 KiB/s 163.39 KiB/s 163.39 KiB/s]
change:
       time:   [+0.0000% +0.0000% +0.0000] (p = NaN > 0.05)
       thrpt:  [+0.0000% +0.0000% +0.0000]
       No change in performance detected.

Download data for profiler.firefox.com or download performance comparison data.

@larseggert larseggert merged commit 105d921 into mozilla:main Dec 10, 2025
102 of 104 checks passed
@larseggert larseggert deleted the fix-2754 branch December 10, 2025 11:47
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

None yet

Projects

None yet

Development

Successfully merging this pull request may close these issues.

Replace qpack::Data with trait.

3 participants