mandrean/cw-optimizoor

Produces larger binaries than cosmwasm workspace-optimizer

de-husk opened this issue · 2 comments

I noticed that the cw-optimizoor optimized binaries are a bit larger than the rust workspace-optimizer for the DAO DAO contracts.

cw-optimizoor:

$ ls -lh artifacts | grep wasm | awk '{print $5,$9}'
293K cw20_stake-x86_64.wasm
295K cw20_staked_balance_voting-x86_64.wasm
196K cw4_voting-x86_64.wasm
278K cw721_stake-x86_64.wasm
161K cw_admin_factory-x86_64.wasm
404K cw_core-x86_64.wasm
175K cw_named_groups-x86_64.wasm
209K cw_names_registry-x86_64.wasm
219K cw_native_staked_balance_voting-x86_64.wasm
495K cw_proposal_multiple-x86_64.wasm
501K cw_proposal_single-x86_64.wasm
178K cw_token_swap-x86_64.wasm
244K stake_cw20_external_rewards-x86_64.wasm
190K stake_cw20_reward_distributor-x86_64.wasm

cosmwasm workspace optimizer:

$ ls -lh artifacts | grep wasm | awk '{print $5,$9}'
257K cw20_stake.wasm
261K cw20_staked_balance_voting.wasm
193K cw4_voting.wasm
276K cw721_stake.wasm
143K cw_admin_factory.wasm
407K cw_core.wasm
173K cw_named_groups.wasm
188K cw_names_registry.wasm
216K cw_native_staked_balance_voting.wasm
455K cw_proposal_multiple.wasm
460K cw_proposal_single.wasm
171K cw_token_swap.wasm
226K stake_cw20_external_rewards.wasm
171K stake_cw20_reward_distributor.wasm

You can see the % difference here: DA0-DA0/dao-contracts#474 (comment)

I wonder if there is a different optimization flag being used?

It does use the same optimizations:
https://github.com/mandrean/cw-optimizoor/blob/master/src/optimization.rs#L72-L74

I wonder if it could be related to the issue with unified feature flags across workspace members in a monorepo maybe.

Let's say cw20_stake depends on some library_a with feature flag x while cw4_voting relies on library_a with feature flag y

Then according to Cargo's built-in feature-flag resolver, it will build library_a for both cw20_stake and cw4_voting with both flag x and y enabled. Worth looking into

Makes sense that the issue is likely related to some of the contracts being used by other contracts with the library feature.

Just to test, I ran the latest cw-optimizoor against the DAO DAO contracts, but compiling everything 'normally', commenting out the compile_ephemerally() step.

Ignoring the empty wasms, the contracts look to be about the same size as workspace optimizer:

ls -lh artifacts | grep wasm | awk '{print $5,$9}'
13K cw20_stake-x86_64.wasm
265K cw20_staked_balance_voting-x86_64.wasm
196K cw4_voting-x86_64.wasm
278K cw721_stake-x86_64.wasm
143K cw_admin_factory-x86_64.wasm
13K cw_core-x86_64.wasm
175K cw_named_groups-x86_64.wasm
194K cw_names_registry-x86_64.wasm
219K cw_native_staked_balance_voting-x86_64.wasm
452K cw_proposal_multiple-x86_64.wasm
456K cw_proposal_single-x86_64.wasm
158K cw_staking_denom_voting-x86_64.wasm
178K cw_token_swap-x86_64.wasm
229K stake_cw20_external_rewards-x86_64.wasm
175K stake_cw20_reward_distributor-x86_64.wasm

Not sure how the cosmwasm rust workspace optimizer gets around this issue.

Also Im realizing now that I made an issue "wasms too small" and now a "wasms too big" issue lol, sorry.