[inspect][dart] Implement a big-small slab allocator

CF-870 #comment

This implements a big-small slab allocator.  The motivation
is to reduce the overhead that occurs when byte or string
properties are allocated.

Use case would be for storing largish URLs, e.g. around
100 characters.

Benchmark results (below) show an overall performance improvement, most
significantly for operations on long byte and string properties.

Implementation notes:

- The size of the big block must be at least 32 bytes, to ensure that 24
  bytes of property name could be stored, per specification.  In
  contrast to property values, property names don't use extents so must
  fit into a single block.  This in turn means that names may not
  necessarily fit into small blocks and have to use large blocks with
  slack space.

- There was some test brittleness because tests were assuming the VMO
  and heap allocator structure.  That was by and large removed.

- VmoWriter had to be rewritten for dependency injection to test all
  heap allocator implementations thoroughly.  This required introducing
  default factories for Heap implementations, and modifying test code to
  use them instead of invoking constructors explicitly.

- Improved diagnostic output for dumpBlocks and error messages.  Many
  error messages now add a VMO block hexdump on test failure.

Benchmarks:

╰─>$ benchstat old.cvt.txt new.cvt.txt
name                   old time/op  new time/op  delta
basic/increment        17.0µs ±42%  11.9µs ±21%  -30.27%  (p=0.001 n=11+13)
basic/setInt           15.2µs ±46%  10.8µs ±16%  -28.97%  (p=0.000 n=11+13)
basic/delNode          29.5µs ±51%  18.5µs ±20%  -37.32%  (p=0.000 n=12+13)
basic/addNode          48.3µs ±57%  31.7µs ±19%  -34.31%  (p=0.000 n=12+13)
basic/setByte          47.9µs ±51%  32.2µs ±20%  -32.73%  (p=0.000 n=12+12)
basic/resetByte        58.2µs ±47%  38.7µs ±15%  -33.50%  (p=0.000 n=12+13)
basic/setByteLong       564µs ±49%   167µs ±14%  -70.32%  (p=0.000 n=12+13)
basic/resetByteLong     757µs ±50%   224µs ±15%  -70.37%  (p=0.000 n=12+13)
basic/setString        38.3µs ±47%  25.7µs ±14%  -32.92%  (p=0.000 n=12+13)
basic/resetString      44.5µs ±51%  27.9µs ±13%  -37.45%  (p=0.000 n=12+13)
basic/setStringLong     602µs ±49%   195µs ±15%  -67.69%  (p=0.000 n=12+13)
basic/resetStringLong   810µs ±50%   250µs ±16%  -69.13%  (p=0.000 n=12+13)
basic/incDouble        18.9µs ±53%  12.1µs ±19%  -35.90%  (p=0.000 n=12+13)
basic/setDouble        16.3µs ±81%  10.8µs ±15%  -33.49%  (p=0.001 n=11+12)
basic/alloc             159µs ±48%   105µs ±14%  -34.24%  (p=0.000 n=12+13)
basic/url               181µs ±48%    90µs ±17%  -50.23%  (p=0.000 n=12+13)

Change-Id: Id1b8a6ea27b94ad1850bd0cf26d1ff4862e95c37
16 files changed
tree: 44dc5662bbe591ed72a2bdd386f39b1cc3af577e
  1. .cargo/
  2. app/
  3. bin/
  4. boards/
  5. bundles/
  6. examples/
  7. lib/
  8. manifest/
  9. packages/
  10. public/
  11. runtime/
  12. shell/
  13. tests/
  14. tools/
  15. .clang-format
  16. .gitignore
  17. AUTHORS
  18. BUILD.gn
  19. CONTRIBUTING.md
  20. LICENSE
  21. OWNERS
  22. PATENTS
  23. README.md
  24. rustfmt.toml
README.md

Topaz

Topaz augments system functionality by implementing interfaces defined by underlying layers. Topaz contains four major categories of software: modules, agents, shells, and runners.

For example, modules include the dashboard, and runners include the Web, Dart, and Flutter runners.

Removed Components

Looking for something that used to be in this repository? The list below provides a code location and sha that can be used to checkout dead code that has been removed. Please note, it is unlikely the code will build or work correctly shas are provided for reference only. Code can be checked out with:

    git checkout <sha> -- $FUCHSIA_DIR/<location>
  • topaz/app/chat: 9f6c31d2ceb8353f229a9ef6b53ba2386ff31867
  • topaz/app/color: 5a023ccb054104846e3e913951bcc7dc277d2274
  • topaz/app/contacts: 80378fe470817750188707de29237282892a3142
  • topaz/app/dashboard: 982984856fec7e45d295a6ca34bdd819b6760b72
  • topaz/app/documents: b5a3ee29b15414f232865128195d14bd8811ab02
  • topaz/app/image: 5e731a943a907cf960ecfbda1c391958f9093afa
  • topaz/app/link_viewer: 00fe1236c6851da5d54c625a8293561bb617804c
  • topaz/app/video: fc03877f787fc119140b900d476c4563bd04a529
  • topaz/bin/repl: fc25fb9b825f4100b316c4d5135156ef05e0dc4b
  • topaz/examples/bluetooth: f4287c5ae0e9b099983121b41be66e1994b83a02
  • topaz/examples/tictactoe: 07fd955f4
  • topaz/tools/dartfmt_extras: acc1f05718af2bcfbba3317a456f82b67eec4e42
  • topaz/tools/mod: acc1f05718af2bcfbba3317a456f82b67eec4e42
  • topaz/tools/widget_explorer: acc1f05718af2bcfbba3317a456f82b67eec4e42
  • topaz/examples/bluetooth: f4287c5ae0e9b099983121b41be66e1994b83a02
  • topaz/bin/repl: fc25fb9b825f4100b316c4d5135156ef05e0dc4b
  • topaz/examples/tictactoe: 07fd955f4
  • topaz/examples/ui/hello_mod: 07fd955f4
  • topaz/examples/ui/sketchy_flutter: 07fd955f4
  • topaz/examples/ui/text_flutter: 07fd955f4
  • topaz/public/lib/agent: 79a60c5d377ed3a55a87d999292036243ff21446
  • topaz/public/lib/config: f489f45e6883df6e3be578342b4e739928adcf77
  • topaz/public/lib/context: f489f45e6883df6e3be578342b4e739928adcf77
  • topaz/public/lib/mod: 75067a620790d76515c3824321eca335a6aa6bab
  • topaz/public/lib/app_driver: 0196bf704f
  • topaz/public/lib/fuchsia_driver: b34f97387
  • topaz/public/lib/decomposition: b34f97387
  • topaz/public/lib/module_resolver: 2e13a4929
  • topaz/public/lib/user: 62cc03e
  • topaz/lib/setui/settings: 4009b4a
  • topaz/public/lib/schemas: e5810dfa1
  • topaz/public/lib/entity: e5810dfa1
  • topaz/public/lib/component: e5810dfa1
  • public/lib/app/dart: 12404bc
  • examples/fidl/echo_client_dart: 12404bc
  • examples/fidl/echo_server_dart: 12404bc
  • examples/fidl/fidl_bindings_performance: 12404bc