Skip to content

Conversation

@osa1
Copy link
Member

@osa1 osa1 commented May 9, 2025

With upcoming change we'll improve decoding performance of enums, but there will be a difference between "sparse" and "dense" enum decoding performance, even though they'll both be faster.

To be able to measure the difference add a "sparse" enum type and a benchmark for decoding it.

"Sparse" means the enum has large gaps between known enum values, or negative enum values.

When decoding this kind of enums, the mapping from the wire varint to the Dart value for the enum needs to be done by binary search, map lookup, or similar.

For "dense" enums, we can have a list of enum values and index the list directly with the varint value, after a range check.

These changes will be done in the follow-up PR(s).

With upcoming change we'll improve decoding performance of enums, but
there will be a difference between "sparse" and "dense" enum decoding
performance even though they'll both be faster.

To be able to measure the difference add a "sparse" enum type and a
benchmark for decoding it.

"Sparse" means the enum has large gaps between known enum values, or
negative enum values.

When decoding this kind of enums, the mapping from the wire `varint` to
the Dart value for the enum needs to be done by binary search, map
lookup, or similar.

For "dense" enums, we can have a list of enum values and index the list
directly with the `varint` value, after a range check.

These changes will be done in the follow-up PR(s).
@osa1 osa1 requested a review from mkustermann May 9, 2025 14:46
@osa1 osa1 merged commit e4fca16 into google:master May 12, 2025
17 checks passed
@osa1 osa1 deleted the sparse_enum_benchmarks branch May 12, 2025 08:34
copybara-service bot pushed a commit to dart-lang/sdk that referenced this pull request May 12, 2025
Revisions updated by `dart tools/rev_sdk_deps.dart`.

dartdoc (https://github.com/dart-lang/dartdoc/compare/e4f9451..95f4208):
  95f4208e  2025-05-12  Sam Rawlins  Simplify Inheritable.computeCanonicalEnclosingContainer. (dart-lang/dartdoc#4047)

http (https://github.com/dart-lang/http/compare/78d6114..e70a41b):
  e70a41b  2025-05-09  Brian Quinlan  Clarify that some headers may not be sent/received (dart-lang/http#1768)
  d99cc3c  2025-05-07  Brian Quinlan  Return a customized `StreamedResponse` from `CronetClient.send` (dart-lang/http#1769)
  6b92d99  2025-05-07  JohnettJobben1  [web_socket_channel] Shorten library description for pub score improvement (dart-lang/http#1737)
  31da355  2025-05-05  Brian Quinlan  Prepare cronet_http/cupertino_http/http/web_socket for release (dart-lang/http#1767)
  dfbe73d  2025-05-05  Brian Quinlan  Ignore received data after the response stream has been closed (dart-lang/http#1766)

protobuf (https://github.com/dart-lang/protobuf/compare/1aaa332..7d2e615):
  7d2e615  2025-05-12  Agam Agarwal  Add fromDart() and toDart() methods to convert between $core.Duration and proto Duration (google/protobuf.dart#986)
  e4fca16  2025-05-12  Ömer Sinan Ağacan  Add sparse enum decoding benchmarks (google/protobuf.dart#984)
  006d3aa  2025-05-09  Ömer Sinan Ağacan  Update protoc_plugin pre-generated protos (google/protobuf.dart#982)
  4abee01  2025-05-09  Ömer Sinan Ağacan  Sort input proto files before processing (google/protobuf.dart#983)
  60e23f1  2025-05-07  Ömer Sinan Ağacan  Fix factory argument types for map fields (google/protobuf.dart#976)
  de6bcc2  2025-05-07  Ömer Sinan Ağacan  Fix packed enum decoding benchmark (google/protobuf.dart#979)
  9daf5ca  2025-05-06  Ömer Sinan Ağacan  Improve packed field decoding (google/protobuf.dart#959)

tools (https://github.com/dart-lang/tools/compare/92f10a9..36f5c9f):
  36f5c9f9  2025-05-05  Jacob MacDonald  broaden the publish tag regex to allow digits (dart-lang/tools#2085)
  c6a10613  2025-05-05  Goddchen  fix(clock): keep micros in monthsAgo, monthsFromNow and yearsAgo (dart-lang/tools#1202)
  f1f8ac18  2025-05-02  Liam Appelbe  [coverage] Fix another flaky lifecycle management error (dart-lang/tools#2082)

webdev (https://github.com/dart-lang/webdev/compare/5bf833d..1ea8462):
  1ea84624  2025-05-08  Nicholas Shahan  [gardening] Temporarily skip failing test case (dart-lang/webdev#2618)

Change-Id: I193c34b97e7acf1cf52c91240765344e47424b73
Reviewed-on: https://dart-review.googlesource.com/c/sdk/+/428100
Commit-Queue: Konstantin Shcheglov <[email protected]>
Auto-Submit: Devon Carew <[email protected]>
Reviewed-by: Konstantin Shcheglov <[email protected]>
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.

2 participants