Skip to content

Commit

Permalink
quic: Avoid bytes for VariableLengthInteger
Browse files Browse the repository at this point in the history
Allocation of bytes objects due to parsing and usage of pack and the
invocation of to_uint() showed significantly in profiles (3.3% sample
matches). Switch to a more procedural approach to avoid the allocation
overhead.
  • Loading branch information
awelzel committed Oct 12, 2023
1 parent 6b9d97a commit 6a67961
Showing 1 changed file with 13 additions and 8 deletions.
21 changes: 13 additions & 8 deletions analyzer/QUIC.spicy
Original file line number Diff line number Diff line change
Expand Up @@ -141,16 +141,21 @@ type VariableLengthInteger = unit {
# https://datatracker.ietf.org/doc/rfc9000/
# Section 16 and Appendix A
#
first_byte: bytes &size=1 {
local uint8_val = uint8($$.to_uint(spicy::ByteOrder::Big));
self.bytes_to_parse = 2**((0xC0 & uint8_val) >> 6);
# Re-pack without most significant two bits for later use.
self.first_byte = pack(0x3f & uint8_val, spicy::ByteOrder::Big);
byte0: uint8 {
self.bytes_to_parse = 2**((0xC0 & $$) >> 6);
self.result = $$ & 0x3F;
}
remaining_bytes: bytes &size=self.bytes_to_parse - 1;

on %done {
self.result = (self.first_byte + self.remaining_bytes).to_uint(spicy::ByteOrder::Big);
byte1: uint8 if ( self.bytes_to_parse > 1 ) {
self.result = (self.result << 8) | $$;
}

byte2: uint8 if ( self.bytes_to_parse > 2 ) {
self.result = (self.result << 8) | $$;
}

byte3: uint8 if ( self.bytes_to_parse > 3 ) {
self.result = (self.result << 8) | $$;
}
};

Expand Down

0 comments on commit 6a67961

Please sign in to comment.