[fidl][rust] Add unsafe_decode to avoid redundant bound checks

In the FIDL decode, there are repeated checks of whether the read offset
exceeds the bounds of the buffer. These really only need to happen once
per inline block as the size of that block is known in advance.

An analogous change added unsafe_encode in
I9e2528efd8c34bc966fe82b82c338fb8a21ff4c0

Rust/Decode/BoolArray/256/WallTime                                                                       slower            1.022-1.071    1788 +/- 24 ns                 1870 +/- 19 ns
Rust/Decode/ByteArray/16/WallTime                                                                        slower            1.081-1.092    50.57 +/- 0.12 ns              54.95 +/- 0.14 ns
Rust/Decode/ByteArray/256/WallTime                                                                       no_sig_diff       0.962-1.075    64.6 +/- 1.8 ns                65.7 +/- 1.8 ns
Rust/Decode/ByteVector/16/WallTime                                                                       faster            0.931-0.937    164.99 +/- 0.19 ns             154.07 +/- 0.32 ns
Rust/Decode/ByteVector/256/WallTime                                                                      faster            0.913-0.990    218.5 +/- 4.9 ns               207.7 +/- 3.8 ns
Rust/Decode/ByteVector/4096/WallTime                                                                     no_sig_diff       0.906-1.153    582 +/- 50 ns                  592 +/- 21 ns
Rust/Decode/ByteVector/65536/WallTime                                                                    no_sig_diff       0.828-1.101    7864 +/- 72 ns                 7574 +/- 1003 ns
Rust/Decode/ByteVectorLimit/1/WallTime                                                                   no_sig_diff       0.837-1.097    175 +/- 23 ns                  166.63 +/- 0.82 ns
Rust/Decode/DatagramSocket/RecvMsg/Request/WallTime                                                      faster            0.887-0.894    78.48 +/- 0.13 ns              69.85 +/- 0.17 ns
Rust/Decode/DatagramSocket/RecvMsg/Result/WallTime                                                       faster            0.922-0.960    758.8 +/- 7.5 ns               713.7 +/- 7.5 ns
Rust/Decode/DatagramSocket/SendMsg2/Request/WallTime                                                     faster            0.935-0.982    696.0 +/- 8.4 ns               666.9 +/- 8.2 ns
Rust/Decode/DatagramSocket/SendMsg2/Result/WallTime                                                      faster            0.802-0.809    101.587 +/- 0.094 ns           81.85 +/- 0.25 ns
Rust/Decode/EmptyStruct/WallTime                                                                         slower            1.125-1.163    31.77 +/- 0.20 ns              36.34 +/- 0.37 ns
Rust/Decode/EnumArray/256/WallTime                                                                       faster            0.835-0.871    4081 +/- 17 ns                 3481 +/- 58 ns
Rust/Decode/ErrorSyntaxResult_Failure/WallTime                                                           faster            0.844-0.851    88.25 +/- 0.11 ns              74.80 +/- 0.22 ns
Rust/Decode/ErrorSyntaxResult_Success/WallTime                                                           faster            0.851-0.855    180.86 +/- 0.22 ns             154.23 +/- 0.17 ns
Rust/Decode/FloatArray/256/WallTime                                                                      slower            1.078-1.168    2268 +/- 84 ns                 2543.5 +/- 7.8 ns
Rust/Decode/GPUMagma/ExecuteImmediateCommandsRequest/CommandByte1024/Semaphore32/WallTime                faster            0.939-0.997    551.7 +/- 7.9 ns               533.7 +/- 8.3 ns
Rust/Decode/GPUMagma/ExecuteImmediateCommandsRequest/CommandByte128/Semaphore8/WallTime                  faster            0.947-0.969    347.7 +/- 2.3 ns               333.2 +/- 1.6 ns
Rust/Decode/HardwareDisplay/OnVsyncEvent/Image64/WallTime                                                faster            0.918-0.981    255.7 +/- 4.1 ns               242.7 +/- 4.2 ns
Rust/Decode/Int32Array/256/WallTime                                                                      no_sig_diff       0.943-1.076    152.3 +/- 5.2 ns               153.4 +/- 4.9 ns
Rust/Decode/Int32Vector/256/WallTime                                                                     no_sig_diff       0.959-1.005    348.3 +/- 4.8 ns               342.0 +/- 3.2 ns
Rust/Decode/Media/StreamPacket/WallTime                                                                  faster            0.896-0.945    119.7 +/- 2.9 ns               110.09 +/- 0.28 ns
Rust/Decode/MessageHeader/WallTime                                                                       faster            0.989-0.996    82.745 +/- 0.072 ns            82.10 +/- 0.22 ns
Rust/Decode/OptionalStructTree/Depth8/WallTime                                                           faster            0.978-0.982    25476 +/- 25 ns                24959 +/- 28 ns
Rust/Decode/PaddedStructTree/Depth8/WallTime                                                             faster            0.944-0.960    6389 +/- 26 ns                 6082 +/- 26 ns
Rust/Decode/String/16/WallTime                                                                           faster            0.959-0.962    164.77 +/- 0.12 ns             158.26 +/- 0.18 ns
Rust/Decode/String/256/WallTime                                                                          no_sig_diff       0.939-1.016    237.7 +/- 4.2 ns               232.1 +/- 5.0 ns
Rust/Decode/String/4096/WallTime                                                                         no_sig_diff       0.960-1.024    945 +/- 19 ns                  937 +/- 11 ns
Rust/Decode/StructArray/256/WallTime                                                                     faster            0.979-0.990    8810 +/- 11 ns                 8676 +/- 36 ns
Rust/Decode/StructField/16/WallTime                                                                      slower            1.018-1.024    180.42 +/- 0.30 ns             184.15 +/- 0.22 ns
Rust/Decode/StructField/256/WallTime                                                                     faster            0.975-0.983    2827.3 +/- 3.5 ns              2767.9 +/- 6.6 ns
Rust/Decode/StructTree/Depth8/WallTime                                                                   faster            0.964-0.971    5545.0 +/- 7.6 ns              5367 +/- 12 ns
Rust/Decode/StructVector/256/WallTime                                                                    faster            0.978-0.982    10282 +/- 13 ns                10080.1 +/- 7.7 ns
Rust/Decode/Table/AllSet/1/WallTime                                                                      faster            0.863-0.942    110.05 +/- 0.97 ns             99.3 +/- 3.5 ns
Rust/Decode/Table/AllSet/16/WallTime                                                                     faster            0.842-0.887    980 +/- 22 ns                  847.0 +/- 3.0 ns
Rust/Decode/Table/AllSet/256/WallTime                                                                    faster            0.864-0.949    37226 +/- 880 ns               33716 +/- 786 ns
Rust/Decode/Table/LastSetOthersReserved/16/WallTime                                                      faster            0.729-0.732    467.04 +/- 0.25 ns             341.28 +/- 0.41 ns
Rust/Decode/Table/LastSetOthersReserved/256/WallTime                                                     faster            0.688-0.694    5873.5 +/- 7.9 ns              4061 +/- 12 ns
Rust/Decode/Table/SingleSet/16_of_16/WallTime                                                            faster            0.761-0.771    568.2 +/- 3.4 ns               435.34 +/- 0.23 ns
Rust/Decode/Table/SingleSet/16_of_256/WallTime                                                           faster            0.870-0.891    1310.4 +/- 1.7 ns              1154 +/- 13 ns
Rust/Decode/Table/SingleSet/1_of_1/WallTime                                                              faster            0.896-0.902    110.16 +/- 0.20 ns             99.032 +/- 0.098 ns
Rust/Decode/Table/SingleSet/1_of_16/WallTime                                                             faster            0.876-0.879    124.39 +/- 0.11 ns             109.12 +/- 0.11 ns
Rust/Decode/Table/SingleSet/1_of_256/WallTime                                                            faster            0.973-0.976    748.88 +/- 0.87 ns             729.71 +/- 0.50 ns
Rust/Decode/Table/SingleSet/256_of_256/WallTime                                                          faster            0.838-0.889    14606 +/- 220 ns               12605 +/- 180 ns
Rust/Decode/Table/Unset/1/WallTime                                                                       slower            1.018-1.032    56.45 +/- 0.29 ns              57.86 +/- 0.12 ns
Rust/Decode/Table/Unset/16/WallTime                                                                      faster            0.910-0.916    71.135 +/- 0.059 ns            64.95 +/- 0.15 ns
Rust/Decode/Table/Unset/256/WallTime                                                                     slower            1.010-1.014    618.65 +/- 0.61 ns             626.18 +/- 0.49 ns
Rust/Decode/Union/LastSet/1/WallTime                                                                     faster            0.841-0.848    85.20 +/- 0.31 ns              71.968 +/- 0.053 ns
Rust/Decode/Union/LastSet/16/WallTime                                                                    faster            0.786-0.793    91.87 +/- 0.27 ns              72.51 +/- 0.11 ns
Rust/Decode/Union/LastSet/256/WallTime                                                                   faster            0.897-0.903    90.27 +/- 0.22 ns              81.244 +/- 0.096 ns

Change-Id: I231a53e208ec4022b4cae98a2eea8a0e5e11e0e5
Reviewed-on: https://fuchsia-review.googlesource.com/c/fuchsia/+/405279
Reviewed-by: Mitchell Kember <mkember@google.com>
Testability-Review: Mitchell Kember <mkember@google.com>
Commit-Queue: Benjamin Prosnitz <bprosnitz@google.com>
1 file changed
tree: a77c0dda161da9f145b82998ea99e561356f9560
  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.