6 个稳定版本

3.4.2 2024 年 3 月 30 日
3.4.1 2024 年 3 月 11 日
3.3.1 2023 年 11 月 2 日
3.3.0 2023 年 10 月 3 日
3.0.0 2023 年 5 月 24 日

#74 in #weight

每月下载量 36 次
用于 2 crates

GPL-3.0-only

125KB
3K SLoC


Subweight

比较由 Substrate 生成的权重文件。

License: GPL v3

该项目解析并比较 Substrate 权重文件。它极大地帮助了大型权重差异的审查过程。结果可以方便地在 CLI 或浏览器中显示。

摘要

手动比较 Substrate 权重文件是一项人类容易出错而计算机擅长完成的任务。
当你想知道我在说什么时;看看 这个差异
现在告诉我哪些行是问题所在,哪些是正常的 😈?看起来不太吸引人,对吧?

这就是 Subweight 发挥作用的地方:它比较旧版本和新版本的所有外部交易。
人性化的输出看起来像这样

这会自动将最严重的违规者排在最前面,并允许人类一眼就能看到正在发生的事情——而不会丢失细节!所有的差异链接都在那里,共享结果就像复制行链接一样简单。与大多数 Substrate 链兼容。享受吧!

你可以使用以下由 subweight-web 提供的公共端点进行尝试

dev 分支部署在 https://weights.tasty.limo:8443/

安装

安装两个二进制文件

cargo install subweight subweight-web

subweight --version
subweight-web --version

编译

rust-toolchain.toml 定义了代码测试所使用的确切 Rust 版本。
格式化规则在 rustfmt.toml 中定义。

git clone https://github.com/ggwpez/substrate-weight-compare

cd substrate-weight-compare/
cargo build --profile production

示例:Web 界面

假设你已经在父目录中检出与 Substrate 兼容的存储库

subweight-web --root ../ --repos polkadot substrate cumulus

然后打开您的浏览器并尝试以下操作

示例:比较权重文件

假设您在以下位置有一些权重文件

  • OLD=repos/polkadot/
  • NEW=my_other_repos/polkadot
    基本命令如下所示
subweight compare files --old $OLD/* --new $NEW/* --method asymptotic

如果您想比较Kusama与Polkadot运行时的权重,命令会变得稍长一些

subweight compare files --old ../polkadot/runtime/kusama/**/weights/*.rs --new ../polkadot/runtime/polkadot/*/weights/*.rs --method asymptotic --ignore-errors --change changed unchanged --unit time --threshold 10
+-----------------------------------------+-----------------------------+----------+----------+---------------+
| File                                    | Extrinsic                   | Old      | New      | Change [%]    |
+=============================================================================================================+
| pallet_election_provider_multi_phase.rs | feasibility_check           | 1.23ms   | 812.80us | -33.90 |
|-----------------------------------------+-----------------------------+----------+----------+---------------|
| frame_benchmarking_baseline.rs          | addition                    | 162.00ns | 112.00ns | -30.86 |
|-----------------------------------------+-----------------------------+----------+----------+---------------|
| runtime_parachains_hrmp.rs              | hrmp_cancel_open_request    | 27.90us  | 39.02us  | +39.86 |
|-----------------------------------------+-----------------------------+----------+----------+---------------|
| pallet_tips.rs                          | slash_tip                   | 15.86us  | 22.61us  | +42.56 |
|-----------------------------------------+-----------------------------+----------+----------+---------------|
| runtime_parachains_initializer.rs       | force_approve               | 3.12us   | 4.53us   | +45.02 |
|-----------------------------------------+-----------------------------+----------+----------+---------------|
| runtime_parachains_hrmp.rs              | clean_open_channel_requests | 366.82us | 590.73us | +61.04 |
|-----------------------------------------+-----------------------------+----------+----------+---------------|
| runtime_parachains_hrmp.rs              | hrmp_accept_open_channel    | 29.81us  | 48.54us  | +62.81 |
|-----------------------------------------+-----------------------------+----------+----------+---------------|
| runtime_parachains_hrmp.rs              | hrmp_close_channel          | 27.58us  | 44.92us  | +62.89 |
|-----------------------------------------+-----------------------------+----------+----------+---------------|
| runtime_parachains_hrmp.rs              | force_process_hrmp_open     | 2.17ms   | 3.64ms   | +67.28 |
|-----------------------------------------+-----------------------------+----------+----------+---------------|
| runtime_parachains_hrmp.rs              | hrmp_init_open_channel      | 32.67us  | 55.70us  | +70.49 |
|-----------------------------------------+-----------------------------+----------+----------+---------------|
| runtime_parachains_hrmp.rs              | force_process_hrmp_close    | 1.21ms   | 2.11ms   | +74.25 |
|-----------------------------------------+-----------------------------+----------+----------+---------------|
| runtime_parachains_hrmp.rs              | force_clean_hrmp            | 1.82ms   | 3.27ms   | +80.04 |
+-----------------------------------------+-----------------------------+----------+----------+---------------+

可以使用 --print-terms 标志来打印术语。由于行很长,此示例省略了它们。

示例:比较Polkadot提交

假设您在Polkadot目录中运行此操作,比较任意Polkadot提交

subweight --verbose compare commits HEAD HEAD~100 --threshold 10 --method asymptotic --path-pattern "runtime/*/src/weights/**/*.rs,bridges/modules/*/src/weights.rs"

+------------------------------------------------------------------+-------------------------+--------+---------+----------------+
| File                                                             | Extrinsic               | Old    | New     | Change [%]     |
+================================================================================================================================+
| runtime/rococo/src/weights/runtime_parachains_paras_inherent.rs  | enter_variable_disputes | -      | -       | ERROR          |
|------------------------------------------------------------------+-------------------------+--------+---------+----------------|
| runtime/westend/src/weights/xcm/pallet_xcm_benchmarks_generic.rs | set_topic               | 2.59us | 10.01us | +286.67 |
|------------------------------------------------------------------+-------------------------+--------+---------+----------------|
| runtime/westend/src/weights/xcm/pallet_xcm_benchmarks_generic.rs | clear_transact_status   | 2.65us | 9.96us  | +276.24 |
|------------------------------------------------------------------+-------------------------+--------+---------+----------------|
| runtime/westend/src/weights/xcm/pallet_xcm_benchmarks_generic.rs | clear_topic             | 2.59us | 8.29us  | +220.04 |
+------------------------------------------------------------------+-------------------------+--------+---------+----------------+

它首先打印减少的(好的)然后按升序绝对值排序的增多的(不好的)。

配置选项

仓库

选择要使用的项目。 Subweight 的目标是与

其他目前兼容但不是硬要求的第三方项目

注意:并非所有仓库都部署到 Subweight 网络服务。

路径模式

使用 glob crate 匹配仓库路径中的文件与给定的模式。
以下是一些Web界面使用的示例。这些示例并未捕获 所有 文件,这是一个错误。

  • Substrate: frame/*/src/weights.rs
  • Polkadot: runtime/*/src/weights/**/*.rs,bridges/modules/*/src/weights.rs
  • Cumulus: **/weights/*.rs,**/weights/xcm/*.rs,**/src/weights.rs

weights/**/*.rs 优先于 weights/*.rs 以包括可能的子文件夹,如XCM。
自动排除 mod.rs 文件。

组件

使用 Regex 过滤要包含的组件。
示例

  • .* 将是 任何 组件。
  • system|assets 将是 systemassets 组件。

外发事务

类似于 组件 过滤,它使用 Regex 过滤外发事务。
示例

  • .* 将是 任何 外发事务。
  • mint|burn 将是 mintburn 外发事务。

评估方法

评估方法定义了如何评估(计算)权重方程。
这是在决定权重是否变差时的决定性因素。

  • 基本:仅考虑权重常量因子加上存储操作。
  • 精确最差:假设两个方程都是超平面,通过评估所有角来找到最大的相对增加。对于 n 个组件的运行时间是 2^n,硬限制为16个组件。
    这需要您的权重文件支持 组件范围注释。一种检查方法是搜索权重.rs文件中的字符串 "The range of component"
  • 猜测最差:尝试应用 精确最差,但假设所有组件的最大值为100,如果没有找到最大值。这是在您的权重文件没有组件范围注释时的最佳尝试方法。
  • 渐近性:将所有组件设置为最大值。可用于了解公式的渐近变化。

注意:存储权重当前设置为RocksDB Substrate默认值。

相对阈值

通过绝对百分比阈值过滤变化结果。
百分比值按增加或减少计算。
例如:从100到150将是+50%,并且会被任何≥50的阈值包括。

绝对阈值

通过绝对阈值过滤变化结果。

维度

Substrate中的权重是彩色的(二维)。其维度是参考时间视角大小。因此,维度可以设置为时间证明。然后将自动选择良好的单位,例如µs用于时间KiB用于证明;具体标量的大小而定。

  • 时间:调用在参考硬件上消耗的执行时间。
  • 证明:调用生成的证明大小(PoV)。

相关的MR是substrate#11637,该MR要求集成您的项目的权重模板以发出彩色权重。

忽略错误

静默忽略解析错误。这在使用包含路径模式时很有用。您可以通过点击红色错误框来查看所有错误。

Git Pull

在比较任何内容之前拉取分支。这确保您处于最后一个提交。
这不会覆盖缓存。因此,新的更改可能需要长达10分钟才能显示出来。

缓存

Web UI缓存成功响应10分钟。目前没有标志可以禁用它。
如果您想确保不提供缓存的结果,请使用提交散列而不是分支。

可能的错误和警告

Web界面

无范围for组件 …

这意味着该调用的权重未更新以显示该组件的确切范围。如果您想要这样做,请使用Substrate的新版本重新运行它们。

… 在旧版本和新版本中具有不同的范围in旧版本和新版本

这意味着组件的范围在旧版本和新版本之间发生了变化。这并非错误或问题,但它使得无法准确比较项,因此产生错误。当使用Guess-*比较方法之一时,它不会尝试进行准确比较,因此错误消失。

运行测试

存在单元集成测试。大多数测试都受功能标志保护。下面的解释涵盖了两者。
您可以使用cargo test仅运行健全性检查。

集成测试

集成测试以宏方式编写,以便易于扩展(参见integration.rs)。它们具有硬编码的预期结果,并在特定提交哈希上运行。
CI会这样做,并且对于Polkadot,也会在主提交上这样做。

git clone https://github.com/ggwpez/substrate-weight-compare
cd substrate-weight-compare

# Clone all the test-able repos
mkdir -p repos
git clone https://github.com/paritytech/polkadot/ repos/polkadot
git clone https://github.com/paritytech/substrate/ repos/substrate
git clone https://github.com/paritytech/cumulus/ repos/cumulus
git clone https://github.com/AcalaNetwork/acala/ repos/acala
git clone https://github.com/AstarNetwork/astar/ repos/astar
git clone https://github.com/PureStake/moonbeam/ repos/moonbeam
git clone https://github.com/ComposableFi/composable/ repos/composable
git clone https://github.com/NodleCode/chain/ repos/chain

# Run ALL the tests
cargo test --release --all-targets --all-features

许可证

仅GPLv3,请参阅LICENSE

依赖关系

~4–6MB
~113K SLoC