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
125KB
3K 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 |
+------------------------------------------------------------------+-------------------------+--------+---------+----------------+
它首先打印减少的(好的)然后按升序绝对值排序的增多的(不好的)。
配置选项
仓库
选择要使用的项目。 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
将是system
和assets
组件。
外发事务
.*
将是 任何 外发事务。mint|burn
将是mint
和burn
外发事务。
评估方法
评估方法定义了如何评估(计算)权重方程。
这是在决定权重是否变差时的决定性因素。
- 基本:仅考虑权重常量因子加上存储操作。
- 精确最差:假设两个方程都是超平面,通过评估所有角来找到最大的相对增加。对于
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