filecoin-project / ref-fvm

Reference implementation of the Filecoin Virtual Machine
https://fvm.filecoin.io/
Other
382 stars 137 forks source link

Reduce monomorphization by using shared, non-generic helper functions #373

Closed raulk closed 2 years ago

raulk commented 2 years ago

So only the outer generic function gets monomorphized.

raulk commented 2 years ago

@Stebalien might explaining this a little bit more and providing links to places where we'd need to refactor?

Stebalien commented 2 years ago

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:

  1. Convert the generic parameter into some common type.
  2. Call a non-generic helper function, moving most of the code into that function.

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]
Kubuxu commented 2 years ago

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. 😂

Stebalien commented 2 years ago

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.

Stebalien commented 2 years ago

Ok, we've switched to cbor4ii which has mostly addressed this issue.