pw_bloat: Cache and optimize label production

The creation of per-data-source labels was previously observed to cause
indefinite execution of `pw bloat` operations on large diffs. After this
change, some indefinitely-executing samples now run in less than a tenth
of a second. One particular benchmark moved from 120 seconds to 0.02
seconds.

It may still be worth exploring how to avoid the exponentially recursive
structure of `_per_data_source_labels`, but for now the simple
introduction of caching appears to have sufficiently addressed the
issue.

Change-Id: I0818f4ccc0519c5533c14cd2b0bbb328d23692d7
Reviewed-on: https://pigweed-review.googlesource.com/c/pigweed/pigweed/+/159474
Reviewed-by: Armando Montanez <amontanez@google.com>
Commit-Queue: Auto-Submit <auto-submit@pigweed-service-accounts.iam.gserviceaccount.com>
Pigweed-Auto-Submit: Taylor Cramer <cramertj@google.com>
Presubmit-Verified: CQ Bot Account <pigweed-scoped@luci-project-accounts.iam.gserviceaccount.com>
1 file changed
tree: ef6b1885d9ac36c08458ac4ea0570dfc5f27b9ab
  1. .allstar/
  2. .vscode/
  3. build_overrides/
  4. docker/
  5. docs/
  6. pw_alignment/
  7. pw_allocator/
  8. pw_analog/
  9. pw_android_toolchain/
  10. pw_arduino_build/
  11. pw_assert/
  12. pw_assert_basic/
  13. pw_assert_log/
  14. pw_assert_tokenized/
  15. pw_assert_zephyr/
  16. pw_async/
  17. pw_async_basic/
  18. pw_base64/
  19. pw_bloat/
  20. pw_blob_store/
  21. pw_bluetooth/
  22. pw_bluetooth_hci/
  23. pw_bluetooth_profiles/
  24. pw_boot/
  25. pw_boot_cortex_m/
  26. pw_build/
  27. pw_build_info/
  28. pw_build_mcuxpresso/
  29. pw_bytes/
  30. pw_checksum/
  31. pw_chrono/
  32. pw_chrono_embos/
  33. pw_chrono_freertos/
  34. pw_chrono_stl/
  35. pw_chrono_threadx/
  36. pw_chrono_zephyr/
  37. pw_cli/
  38. pw_compilation_testing/
  39. pw_console/
  40. pw_containers/
  41. pw_cpu_exception/
  42. pw_cpu_exception_cortex_m/
  43. pw_crypto/
  44. pw_digital_io/
  45. pw_digital_io_mcuxpresso/
  46. pw_docgen/
  47. pw_doctor/
  48. pw_env_setup/
  49. pw_file/
  50. pw_function/
  51. pw_fuzzer/
  52. pw_hdlc/
  53. pw_hex_dump/
  54. pw_i2c/
  55. pw_i2c_linux/
  56. pw_i2c_mcuxpresso/
  57. pw_ide/
  58. pw_interrupt/
  59. pw_interrupt_cortex_m/
  60. pw_interrupt_zephyr/
  61. pw_intrusive_ptr/
  62. pw_kvs/
  63. pw_libc/
  64. pw_log/
  65. pw_log_android/
  66. pw_log_basic/
  67. pw_log_null/
  68. pw_log_rpc/
  69. pw_log_string/
  70. pw_log_tokenized/
  71. pw_log_zephyr/
  72. pw_malloc/
  73. pw_malloc_freelist/
  74. pw_metric/
  75. pw_minimal_cpp_stdlib/
  76. pw_module/
  77. pw_multisink/
  78. pw_package/
  79. pw_perf_test/
  80. pw_persistent_ram/
  81. pw_polyfill/
  82. pw_preprocessor/
  83. pw_presubmit/
  84. pw_protobuf/
  85. pw_protobuf_compiler/
  86. pw_random/
  87. pw_result/
  88. pw_ring_buffer/
  89. pw_router/
  90. pw_rpc/
  91. pw_rpc_transport/
  92. pw_rust/
  93. pw_snapshot/
  94. pw_software_update/
  95. pw_span/
  96. pw_spi/
  97. pw_spi_mcuxpresso/
  98. pw_status/
  99. pw_stm32cube_build/
  100. pw_stream/
  101. pw_stream_uart_linux/
  102. pw_stream_uart_mcuxpresso/
  103. pw_string/
  104. pw_symbolizer/
  105. pw_sync/
  106. pw_sync_baremetal/
  107. pw_sync_embos/
  108. pw_sync_freertos/
  109. pw_sync_stl/
  110. pw_sync_threadx/
  111. pw_sync_zephyr/
  112. pw_sys_io/
  113. pw_sys_io_arduino/
  114. pw_sys_io_baremetal_lm3s6965evb/
  115. pw_sys_io_baremetal_stm32f429/
  116. pw_sys_io_emcraft_sf2/
  117. pw_sys_io_mcuxpresso/
  118. pw_sys_io_pico/
  119. pw_sys_io_stdio/
  120. pw_sys_io_stm32cube/
  121. pw_sys_io_zephyr/
  122. pw_system/
  123. pw_target_runner/
  124. pw_thread/
  125. pw_thread_embos/
  126. pw_thread_freertos/
  127. pw_thread_stl/
  128. pw_thread_threadx/
  129. pw_thread_zephyr/
  130. pw_tls_client/
  131. pw_tls_client_boringssl/
  132. pw_tls_client_mbedtls/
  133. pw_tokenizer/
  134. pw_tool/
  135. pw_toolchain/
  136. pw_trace/
  137. pw_trace_tokenized/
  138. pw_transfer/
  139. pw_unit_test/
  140. pw_unit_test_zephyr/
  141. pw_varint/
  142. pw_watch/
  143. pw_web/
  144. pw_work_queue/
  145. seed/
  146. targets/
  147. third_party/
  148. ts/
  149. zephyr/
  150. .bazelignore
  151. .bazelrc
  152. .black.toml
  153. .clang-format
  154. .clang-tidy
  155. .eslintrc.json
  156. .git-blame-ignore-revs
  157. .gitattributes
  158. .gitignore
  159. .gn
  160. .mypy.ini
  161. .prettierrc.js
  162. .pw_ide.yaml
  163. .pylintrc
  164. activate.bat
  165. Android.bp
  166. AUTHORS
  167. bootstrap.bat
  168. bootstrap.sh
  169. BUILD.bazel
  170. BUILD.gn
  171. BUILDCONFIG.gn
  172. CMakeLists.txt
  173. jest.config.ts
  174. Kconfig.zephyr
  175. LICENSE
  176. modules.gni
  177. OWNERS
  178. package-lock.json
  179. package.json
  180. pigweed.json
  181. PIGWEED_MODULES
  182. README.md
  183. rollup.config.js
  184. tsconfig.json
  185. WORKSPACE
README.md

Pigweed

Pigweed is an open source collection of embedded-targeted libraries–or as we like to call them, modules. These modules are building blocks and infrastructure that enable faster and more reliable development on small-footprint MMU-less 32-bit microcontrollers like the STMicroelectronics STM32L452 or the Nordic nRF52832.

For more information please see our website: https://pigweed.dev/.

Links