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日 |
0.1.0 |
|
#1213 in 神奇豆子
每月76次下载
155KB
3.5K SLoC
Subweight
比较由 Substrate 生成的权重文件。
此项目解析并比较 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 |
+------------------------------------------------------------------+-------------------------+--------+---------+----------------+
它首先打印出减少的(好的)内容,然后按升序绝对值排序的增减内容。
配置选项
仓库
选择要使用的项目。《子权重》的目标是与
其他目前兼容但不是硬性要求的项目
注意:并非所有仓库都部署到了《子权重》网络服务。
路径模式
使用glob包来匹配仓库路径中的给定模式。
以下是网络界面使用的示例。这些示例并不捕获所有文件,这是一个错误。
- 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
文件会自动排除。
组件
使用正则表达式过滤要包含的组件。
示例
.*
将匹配任何组件。system|assets
将匹配system
和assets
组件。
外提
类似于《组件》过滤,这个过滤通过使用正则表达式来过滤外提。
示例
.*
将匹配任何外提。mint|burn
将匹配mint
和burn
外提。
评估方法
评估方法定义了如何评估(计算)权重方程。
这是在决定权重是否变差时的一个决定性因素。
- 基础:仅考虑权重加存储操作的常数因子。
- 精确最坏情况:假设两个方程都是超平面,并通过评估所有角点来找到它们的最大相对增加。对于
n
个组件的运行时间为2^n
,这是硬限制为16个组件。
这需要您的权重文件支持组件范围注释。一种检查方法是搜索字符串“"The range of component"
”在您的weight.rs文件中。 - 猜测最坏情况:尝试应用精确最坏情况,但假设所有组件的最大值为100,如果没有找到最大值。这是一种最佳努力方法,如果你的权重文件没有组件范围注释。
- 渐近:将所有组件设置为它们的最大值。可以用来感受公式的渐近变化。
注意:存储权重目前设置为RocksDB Substrate默认。
相对阈值
通过一个绝对百分比阈值过滤变化结果。
百分比值计算为增加或减少。
例如:从100到150将是+50%,并且会被任何阈值 >=50 包含。
绝对阈值
通过一个绝对阈值过滤变化结果。
维度
Substrate中的权重是彩色的(二维)。其维度是参考时间和视角大小。因此,维度可以设置为时间或证明。然后将自动选择一个好的单位,例如µs
用于时间或KiB
用于证明;具体标量的大小取决于。
- 时间:调用在参考硬件上消耗的执行时间。
- 证明:调用生成的证明-of-validity (PoV) 的大小。
相关的MR是substrate#11637,该MR需要将权重模板集成到你的项目中以发射彩色权重。
忽略错误
静默忽略解析错误。当使用包含路径模式时非常有用。你可以通过点击红色的错误框来查看所有错误。
Git拉取
在比较任何内容之前拉取分支。这确保你处于最新的提交。
这不会覆盖缓存。因此,新的更改可能需要长达10分钟才能显示出来。
缓存
Web UI将成功响应缓存10分钟。目前没有标志来禁用它。
如果你想要确保不提供缓存的响应,请使用提交哈希而不是分支。
可能的错误和警告
Web界面
没有范围forcomponent …
这意味着该调用的权重没有更新以显示该组件的确切范围。如果你想这样做,请使用Substrate的新版本重新运行它们。
…有不同的范围在旧版本和新版本中
这意味着组件的范围在旧版本和新版本之间发生了变化。这不是错误或问题,但它使得无法准确比较术语,因此产生错误。在使用Guess-*
比较方法之一时,它不会尝试进行准确比较,因此错误消失。
运行测试
存在单元和集成测试。大多数测试都受功能标志保护。下面的说明涵盖了两者的内容。
你可以使用cargo test
仅运行健全性检查。
集成测试
集成测试以宏方式编写,以允许轻松扩展(参见integration.rs)。它们具有硬编码的预期结果,以及运行它们的特定提交哈希。
CI会这样做,对于Polkadot也会在master提交上这样做。
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.5–7MB
~121K SLoC