[fidl][rust] Move 'offset' to decode method parameter

The Decoder currently has an offset field. By moving this off the
object to a method parameter, code can directly index into offsets
rather than manipulating state before offset.

A similar change was done for the Encoder, which both had
significant immediate impact and led to later wins. The change was
deferred for the Decoder because immediate wins were less obvious.
However, there are still a number of use cases where this is
expected to have fruitful gains such as when working with padding
or peeking at the result.

There are some improvements and some regressions. The larger regressions
are with non-optimized arrays/vectors where the parameter is repeatedly
passed in.

Rust/Decode/BoolArray/256/WallTime                                                                       slower            1.390-1.463    1249.2 +/- 2.8 ns              1782 +/- 41 ns
Rust/Decode/ByteArray/16/WallTime                                                                        slower            1.009-1.015    49.993 +/- 0.078 ns            50.590 +/- 0.084 ns
Rust/Decode/ByteArray/256/WallTime                                                                       no_sig_diff       0.942-1.075    64.6 +/- 2.4 ns                65.0 +/- 1.9 ns
Rust/Decode/ByteVector/16/WallTime                                                                       slower            1.040-1.052    157.72 +/- 0.23 ns             164.98 +/- 0.68 ns
Rust/Decode/ByteVector/256/WallTime                                                                      no_sig_diff       0.978-1.049    216.7 +/- 4.2 ns               219.5 +/- 3.4 ns
Rust/Decode/ByteVector/4096/WallTime                                                                     no_sig_diff       0.847-1.325    582 +/- 50 ns                  620 +/- 85 ns
Rust/Decode/ByteVector/65536/WallTime                                                                    no_sig_diff       0.980-1.014    7885 +/- 59 ns                 7861 +/- 76 ns
Rust/Decode/ByteVectorLimit/1/WallTime                                                                   no_sig_diff       0.878-1.144    174 +/- 22 ns                  172.60 +/- 0.72 ns
Rust/Decode/DatagramSocket/RecvMsg/Request/WallTime                                                      slower            1.004-1.014    77.85 +/- 0.10 ns              78.55 +/- 0.26 ns
Rust/Decode/DatagramSocket/RecvMsg/Result/WallTime                                                       no_sig_diff       0.985-1.029    756.4 +/- 9.9 ns               761.2 +/- 6.8 ns
Rust/Decode/DatagramSocket/SendMsg2/Request/WallTime                                                     no_sig_diff       0.981-1.046    690 +/- 13 ns                  699.1 +/- 9.4 ns
Rust/Decode/DatagramSocket/SendMsg2/Result/WallTime                                                      slower            1.060-1.072    96.61 +/- 0.29 ns              102.98 +/- 0.30 ns
Rust/Decode/EmptyStruct/WallTime                                                                         slower            1.036-1.052    30.31 +/- 0.14 ns              31.64 +/- 0.11 ns
Rust/Decode/EnumArray/256/WallTime                                                                       slower            1.160-1.195    3474 +/- 16 ns                 4090 +/- 42 ns
Rust/Decode/ErrorSyntaxResult_Failure/WallTime                                                           faster            0.954-0.964    91.63 +/- 0.12 ns              87.86 +/- 0.32 ns
Rust/Decode/ErrorSyntaxResult_Success/WallTime                                                           no_sig_diff       0.979-1.039    182.17 +/- 0.23 ns             183.8 +/- 5.2 ns
Rust/Decode/FloatArray/256/WallTime                                                                      slower            1.287-1.377    1711.3 +/- 3.6 ns              2279 +/- 72 ns
Rust/Decode/GPUMagma/ExecuteImmediateCommandsRequest/CommandByte1024/Semaphore32/WallTime                no_sig_diff       0.984-1.051    547.4 +/- 8.4 ns               556.8 +/- 9.8 ns
Rust/Decode/GPUMagma/ExecuteImmediateCommandsRequest/CommandByte128/Semaphore8/WallTime                  slower            1.013-1.038    344.0 +/- 2.1 ns               352.7 +/- 2.1 ns
Rust/Decode/HardwareDisplay/OnVsyncEvent/Image64/WallTime                                                no_sig_diff       0.978-1.055    250.5 +/- 5.2 ns               254.5 +/- 4.3 ns
Rust/Decode/Int32Array/256/WallTime                                                                      no_sig_diff       0.936-1.092    151.4 +/- 5.3 ns               153.1 +/- 6.5 ns
Rust/Decode/Int32Vector/256/WallTime                                                                     no_sig_diff       0.977-1.040    345.8 +/- 5.3 ns               348.7 +/- 5.6 ns
Rust/Decode/Media/StreamPacket/WallTime                                                                  no_sig_diff       0.976-1.006    120.43 +/- 0.20 ns             119.4 +/- 1.6 ns
Rust/Decode/MessageHeader/WallTime                                                                       slower            1.059-1.065    77.90 +/- 0.16 ns              82.718 +/- 0.093 ns
Rust/Decode/OptionalStructTree/Depth8/WallTime                                                           no_sig_diff       0.989-1.000    25664 +/- 113 ns               25521 +/- 31 ns
Rust/Decode/PaddedStructTree/Depth8/WallTime                                                             faster            0.943-0.955    6727.7 +/- 9.0 ns              6385 +/- 31 ns
Rust/Decode/String/16/WallTime                                                                           slower            1.049-1.053    156.74 +/- 0.17 ns             164.78 +/- 0.13 ns
Rust/Decode/String/256/WallTime                                                                          no_sig_diff       0.996-1.072    231.1 +/- 4.5 ns               238.7 +/- 4.1 ns
Rust/Decode/String/4096/WallTime                                                                         no_sig_diff       0.973-1.027    941 +/- 19 ns                  939.9 +/- 6.0 ns
Rust/Decode/StructArray/256/WallTime                                                                     slower            1.113-1.124    7881 +/- 25 ns                 8812 +/- 15 ns
Rust/Decode/StructField/16/WallTime                                                                      faster            0.959-0.965    187.63 +/- 0.19 ns             180.49 +/- 0.41 ns
Rust/Decode/StructField/256/WallTime                                                                     faster            0.956-0.960    2951.0 +/- 3.9 ns              2825.7 +/- 2.0 ns
Rust/Decode/StructTree/Depth8/WallTime                                                                   faster            0.938-0.947    5881 +/- 19 ns                 5543.1 +/- 6.6 ns
Rust/Decode/StructVector/256/WallTime                                                                    slower            1.054-1.066    9724 +/- 31 ns                 10309 +/- 25 ns
Rust/Decode/Table/AllSet/1/WallTime                                                                      faster            0.970-0.979    115.58 +/- 0.47 ns             112.64 +/- 0.12 ns
Rust/Decode/Table/AllSet/16/WallTime                                                                     no_sig_diff       0.998-1.006    982.1 +/- 3.3 ns               984.24 +/- 0.71 ns
Rust/Decode/Table/AllSet/256/WallTime                                                                    no_sig_diff       0.916-1.018    38759 +/- 818 ns               37422 +/- 1183 ns
Rust/Decode/Table/LastSetOthersReserved/16/WallTime                                                      slower            1.032-1.054    445.3 +/- 1.7 ns               464.5 +/- 3.1 ns
Rust/Decode/Table/LastSetOthersReserved/256/WallTime                                                     slower            1.075-1.080    5475.3 +/- 3.2 ns              5898.1 +/- 9.1 ns
Rust/Decode/Table/SingleSet/16_of_16/WallTime                                                            faster            0.981-0.996    573.190 +/- 0.091 ns           566.7 +/- 4.4 ns
Rust/Decode/Table/SingleSet/16_of_256/WallTime                                                           slower            1.075-1.108    1201.3 +/- 9.9 ns              1310.9 +/- 8.7 ns
Rust/Decode/Table/SingleSet/1_of_1/WallTime                                                              faster            0.992-0.997    113.34 +/- 0.22 ns             112.756 +/- 0.053 ns
Rust/Decode/Table/SingleSet/1_of_16/WallTime                                                             faster            0.888-0.896    139.03 +/- 0.64 ns             124.026 +/- 0.023 ns
Rust/Decode/Table/SingleSet/1_of_256/WallTime                                                            faster            0.968-0.992    765.4 +/- 4.4 ns               750.2 +/- 4.9 ns
Rust/Decode/Table/SingleSet/256_of_256/WallTime                                                          faster            0.842-0.883    16929 +/- 353 ns               14595 +/- 47 ns
Rust/Decode/Table/Unset/1/WallTime                                                                       faster            0.975-0.988    60.09 +/- 0.26 ns              59.01 +/- 0.13 ns
Rust/Decode/Table/Unset/16/WallTime                                                                      faster            0.804-0.820    87.23 +/- 0.32 ns              70.82 +/- 0.42 ns
Rust/Decode/Table/Unset/256/WallTime                                                                     faster            0.871-0.880    695.69 +/- 0.53 ns             609.1 +/- 2.9 ns
Rust/Decode/Union/LastSet/1/WallTime                                                                     faster            0.984-0.990    87.88 +/- 0.12 ns              86.73 +/- 0.13 ns
Rust/Decode/Union/LastSet/16/WallTime                                                                    slower            1.050-1.058    86.46 +/- 0.10 ns              91.09 +/- 0.24 ns
Rust/Decode/Union/LastSet/256/WallTime                                                                   slower            1.023-1.036    88.60 +/- 0.43 ns              91.20 +/- 0.11 ns

Change-Id: I02555b4a27b4077dae80613bd833dd41ce0645e1
Reviewed-on: https://fuchsia-review.googlesource.com/c/fuchsia/+/404853
Reviewed-by: Pascal Perez <pascallouis@google.com>
Reviewed-by: Mitchell Kember <mkember@google.com>
Commit-Queue: Benjamin Prosnitz <bprosnitz@google.com>
Testability-Review: Mitchell Kember <mkember@google.com>
3 files changed
tree: ec4f4b51384646cd575d0953f3ae27fe44074482
  1. boards/
  2. build/
  3. bundles/
  4. cts/
  5. docs/
  6. examples/
  7. garnet/
  8. products/
  9. scripts/
  10. sdk/
  11. src/
  12. third_party/
  13. tools/
  14. zircon/
  15. .clang-format
  16. .clang-tidy
  17. .gitattributes
  18. .gitignore
  19. .gn
  20. .style.yapf
  21. AUTHORS
  22. BUILD.gn
  23. CODE_OF_CONDUCT.md
  24. CONTRIBUTING.md
  25. LICENSE
  26. OWNERS
  27. PATENTS
  28. README.md
  29. rustfmt.toml
README.md

Fuchsia

Pink + Purple == Fuchsia (a new operating system)

What is Fuchsia?

Fuchsia is a modular, capability-based operating system. Fuchsia runs on modern 64-bit Intel and ARM processors.

Fuchsia is an open source project with a code of conduct that we expect everyone who interacts with the project to respect.

How can I build and run Fuchsia?

See Getting Started.

Where can I learn more about Fuchsia?

See fuchsia.dev.