Closed raulk closed 2 years ago
@Stebalien might explaining this a little bit more and providing links to places where we'd need to refactor?
Rust will create a new "copy" of every generic function for every type it's called with. To reduce the amount of code, one can:
That way only the generic part gets copied.
To find code bloat (especially from monomorphizations), use twiggy
. Specifically, twiggy monos my_actor.wasm
.
For example, the miner actor:
Apprx. Bloat Bytes │ Apprx. Bloat % │ Bytes │ % │ Monomorphizations
────────────────────┼────────────────┼─────────┼────────┼───────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────
529243 ┊ 10.53% ┊ 535778 ┊ 10.66% ┊ cs_serde_cbor::de::Deserializer<R>::parse_value
┊ ┊ 6535 ┊ 0.13% ┊ cs_serde_cbor::de::Deserializer<R>::parse_value::hb4eea98bd31e9c74
┊ ┊ 6474 ┊ 0.13% ┊ cs_serde_cbor::de::Deserializer<R>::parse_value::h149b2147018c4e8f
┊ ┊ 6418 ┊ 0.13% ┊ cs_serde_cbor::de::Deserializer<R>::parse_value::ha76c2cb4ae0d0e03
┊ ┊ 6398 ┊ 0.13% ┊ cs_serde_cbor::de::Deserializer<R>::parse_value::h84eab51809962d91
┊ ┊ 6318 ┊ 0.13% ┊ cs_serde_cbor::de::Deserializer<R>::parse_value::h00a48fe07203d3ca
┊ ┊ 6318 ┊ 0.13% ┊ cs_serde_cbor::de::Deserializer<R>::parse_value::h0208eea32461d279
┊ ┊ 6318 ┊ 0.13% ┊ cs_serde_cbor::de::Deserializer<R>::parse_value::h076c98e03f124303
┊ ┊ 6318 ┊ 0.13% ┊ cs_serde_cbor::de::Deserializer<R>::parse_value::h082cfe60d482e5e9
┊ ┊ 6318 ┊ 0.13% ┊ cs_serde_cbor::de::Deserializer<R>::parse_value::h1404f030c78d1069
┊ ┊ 6318 ┊ 0.13% ┊ cs_serde_cbor::de::Deserializer<R>::parse_value::h1c73abe9dab4398f
┊ ┊ 472045 ┊ 9.39% ┊ ... and 75 more.
313079 ┊ 6.23% ┊ 317929 ┊ 6.33% ┊ cs_serde_cbor::de::Deserializer<R>::recursion_checked
┊ ┊ 4850 ┊ 0.10% ┊ cs_serde_cbor::de::Deserializer<R>::recursion_checked::heed8852b778d362b
┊ ┊ 4662 ┊ 0.09% ┊ cs_serde_cbor::de::Deserializer<R>::recursion_checked::hd1d6ac35549fc8e7
┊ ┊ 4109 ┊ 0.08% ┊ cs_serde_cbor::de::Deserializer<R>::recursion_checked::hbc5ee822ce76a63c
┊ ┊ 3921 ┊ 0.08% ┊ cs_serde_cbor::de::Deserializer<R>::recursion_checked::hae28ae864e222df2
┊ ┊ 3567 ┊ 0.07% ┊ cs_serde_cbor::de::Deserializer<R>::recursion_checked::h1f0f2e752bcd071b
┊ ┊ 3358 ┊ 0.07% ┊ cs_serde_cbor::de::Deserializer<R>::recursion_checked::h1b7001fc88895c9b
┊ ┊ 3351 ┊ 0.07% ┊ cs_serde_cbor::de::Deserializer<R>::recursion_checked::hbae241c2099ca448
┊ ┊ 3160 ┊ 0.06% ┊ cs_serde_cbor::de::Deserializer<R>::recursion_checked::hf726c90af689e02d
┊ ┊ 3094 ┊ 0.06% ┊ cs_serde_cbor::de::Deserializer<R>::recursion_checked::h5aaa66803ed72e9d
┊ ┊ 2987 ┊ 0.06% ┊ cs_serde_cbor::de::Deserializer<R>::recursion_checked::h5a89cbe28f258c42
┊ ┊ 280870 ┊ 5.59% ┊ ... and 415 more.
81599 ┊ 1.62% ┊ 82627 ┊ 1.64% ┊ cs_serde_cbor::de::Deserializer<R>::parse_indefinite_str
┊ ┊ 1028 ┊ 0.02% ┊ cs_serde_cbor::de::Deserializer<R>::parse_indefinite_str::h746a2d74c0c71215
┊ ┊ 1006 ┊ 0.02% ┊ cs_serde_cbor::de::Deserializer<R>::parse_indefinite_str::ha0f270912714253e
┊ ┊ 971 ┊ 0.02% ┊ cs_serde_cbor::de::Deserializer<R>::parse_indefinite_str::h030a8a1ceb797e12
┊ ┊ 971 ┊ 0.02% ┊ cs_serde_cbor::de::Deserializer<R>::parse_indefinite_str::h05f6e75730618ae4
┊ ┊ 971 ┊ 0.02% ┊ cs_serde_cbor::de::Deserializer<R>::parse_indefinite_str::h12dfe55fed9da7d4
┊ ┊ 971 ┊ 0.02% ┊ cs_serde_cbor::de::Deserializer<R>::parse_indefinite_str::h151f2c67853308ce
┊ ┊ 971 ┊ 0.02% ┊ cs_serde_cbor::de::Deserializer<R>::parse_indefinite_str::h1bbbc164f9e1959e
┊ ┊ 971 ┊ 0.02% ┊ cs_serde_cbor::de::Deserializer<R>::parse_indefinite_str::h1c5972f0f4594ea8
┊ ┊ 971 ┊ 0.02% ┊ cs_serde_cbor::de::Deserializer<R>::parse_indefinite_str::h207daa980c877d07
┊ ┊ 971 ┊ 0.02% ┊ cs_serde_cbor::de::Deserializer<R>::parse_indefinite_str::h21c3e449a9fcdbca
┊ ┊ 72825 ┊ 1.45% ┊ ... and 75 more.
80808 ┊ 1.61% ┊ 81830 ┊ 1.63% ┊ cs_serde_cbor::de::Deserializer<R>::parse_indefinite_bytes
┊ ┊ 1018 ┊ 0.02% ┊ cs_serde_cbor::de::Deserializer<R>::parse_indefinite_bytes::hc67ec511367ea55a
┊ ┊ 1014 ┊ 0.02% ┊ cs_serde_cbor::de::Deserializer<R>::parse_indefinite_bytes::h4429c596b353f74e
┊ ┊ 996 ┊ 0.02% ┊ cs_serde_cbor::de::Deserializer<R>::parse_indefinite_bytes::h80c4a3703ead2e92
┊ ┊ 961 ┊ 0.02% ┊ cs_serde_cbor::de::Deserializer<R>::parse_indefinite_bytes::h000fb863e66b32bb
┊ ┊ 961 ┊ 0.02% ┊ cs_serde_cbor::de::Deserializer<R>::parse_indefinite_bytes::h06c5a038ac5991bc
┊ ┊ 961 ┊ 0.02% ┊ cs_serde_cbor::de::Deserializer<R>::parse_indefinite_bytes::h072aaeffa776f40c
┊ ┊ 961 ┊ 0.02% ┊ cs_serde_cbor::de::Deserializer<R>::parse_indefinite_bytes::h0b74b6469264c094
┊ ┊ 961 ┊ 0.02% ┊ cs_serde_cbor::de::Deserializer<R>::parse_indefinite_bytes::h1187d50415012d48
┊ ┊ 961 ┊ 0.02% ┊ cs_serde_cbor::de::Deserializer<R>::parse_indefinite_bytes::h12e99868cc41e2e2
┊ ┊ 961 ┊ 0.02% ┊ cs_serde_cbor::de::Deserializer<R>::parse_indefinite_bytes::h259b5e8f8ad1732e
┊ ┊ 72075 ┊ 1.43% ┊ ... and 75 more.
69873 ┊ 1.39% ┊ 77243 ┊ 1.54% ┊ <fil_actors_runtime::runtime::fvm::FvmRuntime<B> as fil_actors_runtime::runtime::Runtime<B>>::transaction
┊ ┊ 7370 ┊ 0.15% ┊ <fil_actors_runtime::runtime::fvm::FvmRuntime<B> as fil_actors_runtime::runtime::Runtime<B>>::transaction::hb22ff67dc9462958
┊ ┊ 6914 ┊ 0.14% ┊ <fil_actors_runtime::runtime::fvm::FvmRuntime<B> as fil_actors_runtime::runtime::Runtime<B>>::transaction::hda764c3797fe9dbb
┊ ┊ 6256 ┊ 0.12% ┊ <fil_actors_runtime::runtime::fvm::FvmRuntime<B> as fil_actors_runtime::runtime::Runtime<B>>::transaction::ha8880932580a5dc9
┊ ┊ 5863 ┊ 0.12% ┊ <fil_actors_runtime::runtime::fvm::FvmRuntime<B> as fil_actors_runtime::runtime::Runtime<B>>::transaction::h5115080d9e28dbc7
┊ ┊ 5837 ┊ 0.12% ┊ <fil_actors_runtime::runtime::fvm::FvmRuntime<B> as fil_actors_runtime::runtime::Runtime<B>>::transaction::h96eccf7665d08a34
┊ ┊ 4841 ┊ 0.10% ┊ <fil_actors_runtime::runtime::fvm::FvmRuntime<B> as fil_actors_runtime::runtime::Runtime<B>>::transaction::hc5bc135275bce530
┊ ┊ 4195 ┊ 0.08% ┊ <fil_actors_runtime::runtime::fvm::FvmRuntime<B> as fil_actors_runtime::runtime::Runtime<B>>::transaction::hfc27a21597310a38
┊ ┊ 4078 ┊ 0.08% ┊ <fil_actors_runtime::runtime::fvm::FvmRuntime<B> as fil_actors_runtime::runtime::Runtime<B>>::transaction::h5cff845c71402e92
┊ ┊ 3975 ┊ 0.08% ┊ <fil_actors_runtime::runtime::fvm::FvmRuntime<B> as fil_actors_runtime::runtime::Runtime<B>>::transaction::hdeb3a0b0fa1ec9bf
┊ ┊ 3866 ┊ 0.08% ┊ <fil_actors_runtime::runtime::fvm::FvmRuntime<B> as fil_actors_runtime::runtime::Runtime<B>>::transaction::h1adec439af9de792
┊ ┊ 24048 ┊ 0.48% ┊ ... and 11 more.
29773 ┊ 0.59% ┊ 30172 ┊ 0.60% ┊ <cs_serde_cbor::de::IndefiniteSeqAccess<R> as serde::de::SeqAccess>::next_element_seed
┊ ┊ 399 ┊ 0.01% ┊ <cs_serde_cbor::de::IndefiniteSeqAccess<R> as serde::de::SeqAccess>::next_element_seed::h5a82a7d08bc145b5
┊ ┊ 386 ┊ 0.01% ┊ <cs_serde_cbor::de::IndefiniteSeqAccess<R> as serde::de::SeqAccess>::next_element_seed::haf0caf7dbd1e319d
┊ ┊ 375 ┊ 0.01% ┊ <cs_serde_cbor::de::IndefiniteSeqAccess<R> as serde::de::SeqAccess>::next_element_seed::h705fd2a4f0552b1b
┊ ┊ 375 ┊ 0.01% ┊ <cs_serde_cbor::de::IndefiniteSeqAccess<R> as serde::de::SeqAccess>::next_element_seed::ha3df2ca4976a33d5
┊ ┊ 324 ┊ 0.01% ┊ <cs_serde_cbor::de::IndefiniteSeqAccess<R> as serde::de::SeqAccess>::next_element_seed::h1f00e5228a5723b6
┊ ┊ 323 ┊ 0.01% ┊ <cs_serde_cbor::de::IndefiniteSeqAccess<R> as serde::de::SeqAccess>::next_element_seed::h2384d4049f5b410c
┊ ┊ 322 ┊ 0.01% ┊ <cs_serde_cbor::de::IndefiniteSeqAccess<R> as serde::de::SeqAccess>::next_element_seed::h5f9b049e9ff217c5
┊ ┊ 320 ┊ 0.01% ┊ <cs_serde_cbor::de::IndefiniteSeqAccess<R> as serde::de::SeqAccess>::next_element_seed::h08dfeb634d7fdd79
┊ ┊ 320 ┊ 0.01% ┊ <cs_serde_cbor::de::IndefiniteSeqAccess<R> as serde::de::SeqAccess>::next_element_seed::h36e66f1b77e05d4e
┊ ┊ 320 ┊ 0.01% ┊ <cs_serde_cbor::de::IndefiniteSeqAccess<R> as serde::de::SeqAccess>::next_element_seed::h5bc1315d0ad67e33
┊ ┊ 26708 ┊ 0.53% ┊ ... and 88 more.
28428 ┊ 0.57% ┊ 28630 ┊ 0.57% ┊ <core::result::Result<T,F> as core::ops::try_trait::FromResidual<core::result::Result<core::convert::Infallible,E>>>::from_residual
┊ ┊ 109 ┊ 0.00% ┊ <core::result::Result<T,F> as core::ops::try_trait::FromResidual<core::result::Result<core::convert::Infallible,E>>>::from_residual::hea397bbfd59923fd
┊ ┊ 105 ┊ 0.00% ┊ <core::result::Result<T,F> as core::ops::try_trait::FromResidual<core::result::Result<core::convert::Infallible,E>>>::from_residual::h0091114faf8c220e
┊ ┊ 105 ┊ 0.00% ┊ <core::result::Result<T,F> as core::ops::try_trait::FromResidual<core::result::Result<core::convert::Infallible,E>>>::from_residual::h010006275461a9ff
┊ ┊ 105 ┊ 0.00% ┊ <core::result::Result<T,F> as core::ops::try_trait::FromResidual<core::result::Result<core::convert::Infallible,E>>>::from_residual::h02a987a92aa0ff74
┊ ┊ 105 ┊ 0.00% ┊ <core::result::Result<T,F> as core::ops::try_trait::FromResidual<core::result::Result<core::convert::Infallible,E>>>::from_residual::h0364ff7d1f6591dc
┊ ┊ 105 ┊ 0.00% ┊ <core::result::Result<T,F> as core::ops::try_trait::FromResidual<core::result::Result<core::convert::Infallible,E>>>::from_residual::h040e1f7078d6b0c0
┊ ┊ 105 ┊ 0.00% ┊ <core::result::Result<T,F> as core::ops::try_trait::FromResidual<core::result::Result<core::convert::Infallible,E>>>::from_residual::h089fd2ed04406b52
┊ ┊ 105 ┊ 0.00% ┊ <core::result::Result<T,F> as core::ops::try_trait::FromResidual<core::result::Result<core::convert::Infallible,E>>>::from_residual::h08d9773490486079
┊ ┊ 105 ┊ 0.00% ┊ <core::result::Result<T,F> as core::ops::try_trait::FromResidual<core::result::Result<core::convert::Infallible,E>>>::from_residual::h094dd6f0064cfd45
┊ ┊ 105 ┊ 0.00% ┊ <core::result::Result<T,F> as core::ops::try_trait::FromResidual<core::result::Result<core::convert::Infallible,E>>>::from_residual::h0b04b75912bf1b8a
┊ ┊ 27576 ┊ 0.55% ┊ ... and 300 more.
25203 ┊ 0.50% ┊ 25555 ┊ 0.51% ┊ <cs_serde_cbor::de::SeqAccess<R> as serde::de::SeqAccess>::next_element_seed
┊ ┊ 352 ┊ 0.01% ┊ <cs_serde_cbor::de::SeqAccess<R> as serde::de::SeqAccess>::next_element_seed::hbdc7769eeb0960a8
┊ ┊ 339 ┊ 0.01% ┊ <cs_serde_cbor::de::SeqAccess<R> as serde::de::SeqAccess>::next_element_seed::h95274f9e143c770e
┊ ┊ 328 ┊ 0.01% ┊ <cs_serde_cbor::de::SeqAccess<R> as serde::de::SeqAccess>::next_element_seed::h2aafe817ce91cfac
┊ ┊ 328 ┊ 0.01% ┊ <cs_serde_cbor::de::SeqAccess<R> as serde::de::SeqAccess>::next_element_seed::hf920f0e1c46f14ff
┊ ┊ 277 ┊ 0.01% ┊ <cs_serde_cbor::de::SeqAccess<R> as serde::de::SeqAccess>::next_element_seed::ha67a0d4b08d6f30a
┊ ┊ 274 ┊ 0.01% ┊ <cs_serde_cbor::de::SeqAccess<R> as serde::de::SeqAccess>::next_element_seed::h0b45afd80cd04007
┊ ┊ 273 ┊ 0.01% ┊ <cs_serde_cbor::de::SeqAccess<R> as serde::de::SeqAccess>::next_element_seed::h941f3d227d00a373
┊ ┊ 272 ┊ 0.01% ┊ <cs_serde_cbor::de::SeqAccess<R> as serde::de::SeqAccess>::next_element_seed::h25fc33523230824e
┊ ┊ 272 ┊ 0.01% ┊ <cs_serde_cbor::de::SeqAccess<R> as serde::de::SeqAccess>::next_element_seed::h40036962f9c699a7
┊ ┊ 272 ┊ 0.01% ┊ <cs_serde_cbor::de::SeqAccess<R> as serde::de::SeqAccess>::next_element_seed::h532b75f5bc6537ac
┊ ┊ 22568 ┊ 0.45% ┊ ... and 88 more.
20748 ┊ 0.41% ┊ 21068 ┊ 0.42% ┊ cs_serde_cbor::de::Deserializer<R>::parse_str
┊ ┊ 296 ┊ 0.01% ┊ cs_serde_cbor::de::Deserializer<R>::parse_str::hdda6f01a8b1fd268
┊ ┊ 271 ┊ 0.01% ┊ cs_serde_cbor::de::Deserializer<R>::parse_str::h718910033eb54b9c
┊ ┊ 247 ┊ 0.00% ┊ cs_serde_cbor::de::Deserializer<R>::parse_str::h06f3d19e0d222c59
┊ ┊ 247 ┊ 0.00% ┊ cs_serde_cbor::de::Deserializer<R>::parse_str::h070c2b582d81bcb2
┊ ┊ 247 ┊ 0.00% ┊ cs_serde_cbor::de::Deserializer<R>::parse_str::h089a96f5dba12799
┊ ┊ 247 ┊ 0.00% ┊ cs_serde_cbor::de::Deserializer<R>::parse_str::h098c6144a88d8b34
┊ ┊ 247 ┊ 0.00% ┊ cs_serde_cbor::de::Deserializer<R>::parse_str::h106bc4a75439ab98
┊ ┊ 247 ┊ 0.00% ┊ cs_serde_cbor::de::Deserializer<R>::parse_str::h158ad63d9b5c8178
┊ ┊ 247 ┊ 0.00% ┊ cs_serde_cbor::de::Deserializer<R>::parse_str::h163dc3a051b277be
┊ ┊ 247 ┊ 0.00% ┊ cs_serde_cbor::de::Deserializer<R>::parse_str::h1972a13fedf9ff04
┊ ┊ 18525 ┊ 0.37% ┊ ... and 75 more.
20160 ┊ 0.40% ┊ 20437 ┊ 0.41% ┊ serde::de::Visitor::visit_i128
┊ ┊ 277 ┊ 0.01% ┊ serde::de::Visitor::visit_i128::hb690c6c20fb4e393
┊ ┊ 240 ┊ 0.00% ┊ serde::de::Visitor::visit_i128::h0547fc328147be4b
┊ ┊ 240 ┊ 0.00% ┊ serde::de::Visitor::visit_i128::h076d036feb9a1d9b
┊ ┊ 240 ┊ 0.00% ┊ serde::de::Visitor::visit_i128::h0f86400a827f34f9
┊ ┊ 240 ┊ 0.00% ┊ serde::de::Visitor::visit_i128::h14de97163944d2b3
┊ ┊ 240 ┊ 0.00% ┊ serde::de::Visitor::visit_i128::h154db08d324d4b1e
┊ ┊ 240 ┊ 0.00% ┊ serde::de::Visitor::visit_i128::h183c644acf26e589
┊ ┊ 240 ┊ 0.00% ┊ serde::de::Visitor::visit_i128::h1a67f12d78181cdb
┊ ┊ 240 ┊ 0.00% ┊ serde::de::Visitor::visit_i128::h1daa53d278bb4ab1
┊ ┊ 240 ┊ 0.00% ┊ serde::de::Visitor::visit_i128::h1edd2a6b143d45f7
┊ ┊ 18000 ┊ 0.36% ┊ ... and 75 more.
540536 ┊ 10.76% ┊ 1114623 ┊ 22.18% ┊ ... and 6581 more.
1739450 ┊ 34.62% ┊ 2335892 ┊ 46.49% ┊ Σ [6701 Total Rows]
Another way to do it, and it should work for what CBOR encoders do I moving some parts of code (like three recursion check) into non generic helper and accepting a trait as param.
After reading it, it sounds almost the same as what Stebalien wrote. 😂
Another way to do it, and it should work for what CBOR encoders do I moving some parts of code (like three recursion check) into non generic helper and accepting a trait as param.
This is tricky because serde itself is deeply generic.
Ok, we've switched to cbor4ii which has mostly addressed this issue.
So only the outer generic function gets monomorphized.